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 で開く →

関連項目