【发布时间】:2020-12-10 14:56:05
【问题描述】:
我正在使用 Postgres 13 并创建了一个包含 A、B 和 C 列的表。该表由 A 分区,具有 2 个可能的值。分区 1 包含 B 和 C 各 100 个可能的值,而分区 2 具有 100 个完全不同的 B 值和 1 个不同的 C 值。我已将两列的统计信息设置为最大值,因此这绝对不会导致任何问题
如果我在任一分区上按 B 和 C 分组,Postgres 会正确估计组数。但是,如果我对我真正想要的基表运行查询,它估计我假设 A、B 和 C 之间没有函数依赖关系,即 (p1B + p1C) * (p2B + p2C) 为 200 * 101 相反到现实的 p1B * p1C + p2B * p2C 为 10000 + 100。
我想我有一半期望它对底层分区求和,而不是使用基表可以看到的 200 个 B 和 101 个 C 的完整计数。此外,如果我也将 A 添加到组中,那么估计会错误地进一步加倍,因为它认为该集合也将针对 A 的每个值重复。
这一切都让我觉得我需要一个扩展的统计数据来告诉它 A 影响 B 或 C 或两者。但是,如果我在基本分区上设置一个并分析,则 pg_statistic_ext_data->stxdndistinct 中的值为空。而如果我在分区本身上设置它,这似乎确实有效,但并不是特别有用,因为在这个级别上估计已经是正确的。如何让 Postgres 正确估计基表,而不必对所有分区运行查询并将它们联合在一起?
【问题讨论】: