我正在使用Postgres 13,并创建了一个包含A、B和C列的表。该表由A分区,有2个可能的值。分区1为B和C各包含100个可能的值,而分区2为B和C分别包含100个完全不同的值和1个不同的值。我已将这两个列的统计信息设置为最大值,这样肯定不会导致任何问题
如果我在任何一个分区上按B和C分组,Postgres会正确地估计出组的数量。然而,如果我在我真正想要的基表上运行查询,它会估计出我假设的A、B和C之间没有函数依赖,即200 * 101的(p1B + p1C) * (p2B + p2C),而不是10000 + 100的p1B * p1C + p2B * p2C的实际情况。
我想我有一半希望它对底层分区求和,而不是使用基表可以看到的200B和101C的完整计数。此外,如果我还将A添加到组中,那么估计会错误地进一步加倍,因为它认为这个集合也将为A的每个值重复。
这一切都让我认为,我需要一个扩展的统计数据来告诉它,A影响B或C,或者两者都有。但是,如果我在基本分区上设置1并进行分析,则pg_statistic_ext_data->stxdndistinct中的值为null。然而,如果我在分区本身上设置它,这似乎是可行的,尽管这并不是特别有用,因为在这个级别上估计已经是正确的。我如何让Postgres对基表进行正确的估计,而不必对所有分区运行查询并将它们联合在一起?
发布于 2020-12-10 23:13:15
您可以在分区表上定义扩展统计信息,但是在这种情况下,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;这当然还有改进的空间;也许从一开始就不允许在分区表上定义扩展统计数据。
发布于 2020-12-17 16:54:23
我发现我只需要打开enable_partitionwise_aggregate就可以正确地估计结果
https://stackoverflow.com/questions/65236927
复制相似问题