我注意到我正在调整的数据库(postgres 9.2)没有对我感兴趣的许多表运行自动分析,我不太明白为什么。我的理解/期望是基于当前配置,自动分析将在假设表增长或由> = 10%的行修改时运行。但是,基于我在查询数据库时看到的信息情况并非如此。
这是一组在pg_stat_all_tables上运行查询的结果,该数据库已经在prod中运行了一年多(结果截断和实际表名被编辑)
┌────────────────────┬────────────────────────────────────┬──────────────────┬───────────────────┐
│ relname │ last_autovacuum │ autovacuum_count │ last_autoanalyze │ autoanalyze_count │
├────────────────────┼─────────────────┼──────────────────┼──────────────────┼───────────────────┤
│ a_large_table │ ¤ │ 0 │ ¤ │ 0 │
│ table_a │ 2014-04-01 │ 1 │ 2014-04-01 │ 1 │
│ table_b │ 2014-04-01 │ 1 │ 2014-04-01 │ 1 │
│ a_very_large_table │ ¤ │ 0 │ ¤ │ 0 │
└────────────────────┴─────────────────┴──────────────────┴──────────────────┴───────────────────┘
请注意,table_a和table_b经常被清除旧数据,因此最近这些数据会进行autovacuum / autoanalyze是有道理的。但是,我也期望其他大型表格最近也至少得到了分析。
为了更好的衡量,这里是postgresql.conf ...
#------------------------------------------------------------------------------
# AUTOVACUUM PARAMETERS
#------------------------------------------------------------------------------
autovacuum = on
log_autovacuum_min_duration = 1000
autovacuum_max_workers = 3
autovacuum_naptime = 1min
autovacuum_vacuum_threshold = 100
autovacuum_analyze_threshold = 100
autovacuum_vacuum_scale_factor = 0.2
autovacuum_analyze_scale_factor = 0.1
autovacuum_freeze_max_age = 200000000
autovacuum_vacuum_cost_delay = 20ms
autovacuum_vacuum_cost_limit = -1
答案 0 :(得分:0)
当10%的元组被更改时,看起来应该对表进行真空分析。基于postgresql.conf设置,
autovacuum analyze threshold = 100 + 0.1 * table size before vacuum
其他要检查的事项:
ps -ef | grep vacuum
参见Gabrielle Roth在规模的autovacuum谈话中的幻灯片: https://wiki.postgresql.org/images/b/b5/Groth_scale12x_autovacuum.pdf