DBAtlas · 数据库运维图谱

查找统计信息过期的表(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)。

在 DBAtlas 中打开 →

相关内容