【发布时间】:2020-06-30 11:22:42
【问题描述】:
我正在尝试优化我们在 Postgres 上的查询,这有时需要几分钟才能使用大型表。开始查看查询计划,发现使用EXPLAIN ANALYZE 运行时估计的行数与实际行数相差近 1000 倍。
这将我引向参数default_statistics_target,它控制ANALYZE 命令采样的行数,以收集查询计划器使用的统计信息。正如少数博客所建议的那样,我通过增加值将其设置为1000 并将事件设置为10000 的最大允许值进行了实验。
每次运行ANALYZE 以确保其统计信息已更新。但令人惊讶的是,这根本没有改善行估计。事实上,它进一步降低了估计值,这似乎很奇怪。
还通过将值减小到10 进行了测试。这似乎使计数有所改善。所以我很困惑,如果参数真的做了我认为它做的事情。或者,如果有其他方法可以改进行估计。任何帮助将不胜感激。
Postgres 版本:9.6
查询计划:在最后的索引扫描步骤中,估计为 462,但实际为 1.9M。 https://explain.depesz.com/s/GZY
更改default_statistics_target = 1000 后,索引扫描步骤中的行是
-> (cost=0.57..120.42 rows=114 width=32) (actual time=248.999..157947.395 rows=1930518 loops=1)
将其设置为default_statistics_target = 10,计数为:
-> (cost=0.57..2610.79 rows=2527 width=32) (actual time=390.437..62668.837 rows=1930518 loops=1)
附:正在考虑的表有超过 1 亿行。
【问题讨论】:
-
InitPlan 计算的值会不会是
event_name_id最常见的值?查询是什么? -
@LaurenzAlbe 添加了查询。是的。子查询返回的值将是事件表中 event_name_id 的最常见值。那应该得到更好的估计吧?
标签: postgresql performance query-optimization