Postgres通过分区扩展了统计信息



我使用的是Postgres 13,并创建了一个包含a、B和C列的表。该表由a分区,a有两个可能的值。分区1包含B和C各自的100个可能值,而分区2有100个完全不同的B值和1个不同的C值

如果我在任一分区上按B和C分组,Postgres会正确估计组的数量。然而,如果我对我真正想要的基表运行查询,它会估计出我认为A、B和C之间没有函数依赖关系,即对于200*101,(p1B+p1C(*(p2B+p2C(,而对于10000+100,p1B*p1C+p2B*p2C的实际情况相反。

我想我有点期待它对底层分区求和,而不是使用基表可以看到的200个B和101个C的完整计数。此外,如果我也将A添加到组中,那么估计值会错误地进一步翻倍,因为它认为这个集合也会为A的每个值重复。

这一切都让我觉得我需要一个扩展的统计数据来告诉它A影响B或C,或者两者都影响。然而,如果我在基本分区上设置一个并进行分析,则pg_statistic_ext_data中的值->stxdndistinct为null。然而,如果我在分区本身上设置它,这似乎确实有效,尽管不是特别有用,因为在这个级别上估计已经是正确的。如何让Postgres正确地对基表进行估计,而不必对所有分区运行查询并将它们联合在一起?

您可以在分区表上定义扩展统计信息,但PostgreSQL在这种情况下不会收集任何数据。您必须分别在所有分区上创建扩展统计信息。

您可以通过查询ANALYZE:后收集的数据来确认

SELECT s.stxrelid::regclass AS table_name,
s.stxname AS statistics_name,
d.stxdndistinct AS ndistinct,
d.stxddependencies AS dependencies
FROM pg_statistic_ext AS s
JOIN pg_statistic_ext_data AS d
ON d.stxoid = s.oid;

这里当然还有改进的空间;也许一开始就不允许在分区表上定义扩展统计信息。

我发现我只需要打开enable_partitionwise_aggregate就可以正确估计

最新更新