統計が古くなった表を特定(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はブロックしない)。