是否有一个选择性子句来直接在PostgreSQL中注入选择性,类似于IBM DB2



IBM DB2支持selectivity子句来提供额外的选择性信息以及帮助查询优化的基本谓词:

选择性子句只能用于基本谓词(as)在SQL引用中定义),而不是像LIKE或BETWEEN这样的谓词。一个较低的选择性值(非常小的数字)将告诉DB2谓词将限定更少的行(并鼓励使用索引)定义在该列上)。更高的选择性值(接近1)将意思正好相反。

文档中的一个例子:

SELECT c1, c2, c3, FROM T1, T2, T3
        WHERE T1.x = T2.x AND
        T2.y=T3.y AND
        T1.x >= ? selectivity 0.00001 AND
        T2.y > ? selectivity 0.5 AND
        T3.z = ? selectivity 0.2 AND
        T3.w = ?

我正在寻找PostgreSQL中类似的功能,通过该功能,我们可以将每个谓词的选择性或至少在关系级别直接作为查询的一部分注入选择性。真的存在吗?或者在这方面有什么正在进行的工作吗?如果没有正在进行的工作,我应该如何开始实现这个功能?

附加说明:选择性=基数/(记录数)。由谓词引起的选择性是表中满足谓词的元组的比例。关系的选择性取决于查询中涉及该关系的所有谓词的选择性。

我正在寻找PostgreSQL中类似的功能,通过该功能,我们可以将每个谓词的选择性或至少在关系级别直接作为查询的一部分注入选择性。真的存在吗?

对于操作符来说没有这样的。

对于表,您可以修改pg_statistic,但这只允许您在stats模型提供的限制内伪造统计数据。例如,由于PostgreSQL不尝试识别列间的相关性,因此没有地方存储这样的信息,也没有办法查找它。

在这方面有任何正在进行的工作吗?

我不知道。您可以在pgsql-hackers邮件列表中找到更多信息。

如果没有正在进行的工作,我应该如何开始实现这个功能?

再一次,我要把它放在pgsql-hackers上。在此之前,请先阅读一下PostgreSQL社区关于查询提示的政策。

有成本暗示的先例(参见CREATE FUNCTIONCOST术语)和覆盖ANALYZE的估计。因此,我认为您应该能够在这里进行一些牵引,尽管您应该期望在语法上进行大量的自行车脱落。

最新更新