【问题标题】:Postgres extended statistics with partitioning带有分区的 Postgres 扩展统计信息
【发布时间】: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 正确估计基表,而不必对所有分区运行查询并将它们联合在一起?

【问题讨论】:

    标签: postgresql partitioning


    【解决方案1】:

    您可以在分区表上定义扩展统计信息,但 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;
    

    这里肯定有改进的余地;也许一开始就不允许在分区表上定义扩展统计信息。

    【讨论】:

    • 也许一开始就不允许在分区表上定义扩展统计信息”——或者更好:将它级联到所有分区;)就像索引一样跨度>
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2017-05-15
      • 2016-01-15
      • 2012-09-18
      • 2020-11-13
      • 2018-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多