查找统计信息过期的表(ANALYZE 策略)
PostgreSQL维护命令
SELECT schemaname,
relname AS table_name,
n_live_tup,
n_mod_since_analyze,
round(100.0 * n_mod_since_analyze / NULLIF(n_live_tup, 0), 1) AS mod_pct,
greatest(last_analyze, last_autoanalyze) AS last_analyzed,
round(current_setting('autovacuum_analyze_threshold')::int
+ current_setting('autovacuum_analyze_scale_factor')::numeric * n_live_tup) AS autoanalyze_at
FROM pg_stat_user_tables
WHERE n_mod_since_analyze > 0
ORDER BY mod_pct DESC NULLS LAST
LIMIT 20;
-- After a bulk load, without waiting for autovacuum
ANALYZE (VERBOSE) orders;作用
显示自上次 ANALYZE 以来修改的行数、其与活行数的比例,以及 autovacuum 触发 ANALYZE 的大致修改阈值。
适用场景
大批量加载/删除之后、计划显示错误的行数估算时,或怀疑 autoanalyze 在大表上滞后时。
注意
计算出的阈值使用全局设置;如果存在表级 autovacuum_analyze_* reloptions(pg_class.reloptions),实际阈值会不同。在大表上默认的 scale_factor(0.1)触发得太晚;请按表调低。autovacuum 不会对分区表的父表执行 ANALYZE;父表级统计信息需要手动 ANALYZE。autovacuum 永远看不到临时表。ANALYZE 读取样本并获取 ShareUpdateExclusiveLock(不阻塞 DML)。