TL;DR - 我还没有激活收集器,它似乎不是默认的;这有多糟糕,我应该激活它吗?
我刚刚在查询速度很慢的表上创建了一个新索引。
我通过
Explain
在查询上运行并在表/查询列的各种组合上创建索引来做到这一点。再次运行后,我没收了未使用的索引
Explain
,保留了已使用的索引然后我决定检查为该表收集的统计信息。事实证明,
SELECT schemaname, relname, last_analyze FROM pg_stat_all_tables WHERE relname = '<MY TABLE>';
最后一次分析返回 NULL。检查
postgresql.conf
我发现目前我根本没有分析...
...
#------------------------------------------------------------------------------
# STATISTICS
#------------------------------------------------------------------------------
# - Query and Index Statistics Collector -
#track_activities = on
#track_counts = on
#track_io_timing = off
#track_functions = none # none, pl, all
#track_activity_query_size = 1024 # (change requires restart)
#stats_temp_directory = 'pg_stat_tmp'
...
我的问题
- 查询规划器是否仍然有足够的信息来知道何时进行索引与进行全表扫描等?
- 什么时候应该考虑激活查询和索引统计收集器?(总是,仅在某些情况下,...)
统计收集器已经激活,不用担心。
请注意,统计收集器收集的统计信息不是优化器使用的表统计信息,而是有关数据库工作负载的数据。
表统计信息由 autovacuum 收集,默认情况下也启用。
两者之间存在联系,因为 autovacuum 依赖于统计收集器收集的统计信息来知道何时应该
ANALYZE
使用表。您是否对 conf 文件中的设置被注释掉感到困惑?被注释掉并不意味着它是关闭的,它意味着它有它的编译默认值,即
on
track_activities 和 track_counts。(我也会打开 track_io_timings——计划者不使用它,但为您提供了很好的信息)。“pg_stat_all_tables”中的数据不是很持久。每次服务器崩溃或立即关闭或调用 pg_stat_reset() 时,它都会丢失。现在所有这些东西在生产服务器上应该是非常罕见的,但也许您没有使用生产服务器进行测试,而且无论如何它们并不总是像应有的那样罕见。如果您改为查看 pg_stats,这将使您更好地了解分析是否真的曾经在表上运行过。