実行中のautovacuum/VACUUM操作の進捗を監視
PostgreSQLメンテナンスコマンド
SELECT p.pid,
a.backend_type,
p.datname,
p.relid::regclass AS table_name,
p.phase,
pg_size_pretty(p.heap_blks_total * current_setting('block_size')::bigint) AS table_size,
round(100.0 * p.heap_blks_scanned / NULLIF(p.heap_blks_total, 0), 1) AS scanned_pct,
round(100.0 * p.heap_blks_vacuumed / NULLIF(p.heap_blks_total, 0), 1) AS vacuumed_pct,
p.index_vacuum_count,
now() - a.xact_start AS running_for,
a.wait_event_type || ':' || a.wait_event AS wait,
left(a.query, 80) AS query
FROM pg_stat_progress_vacuum p
JOIN pg_stat_activity a USING (pid)
ORDER BY running_for DESC;
-- Busy autovacuum workers / upper limit
SELECT count(*) FILTER (WHERE backend_type = 'autovacuum worker') AS av_workers_busy,
current_setting('autovacuum_max_workers') AS av_max_workers
FROM pg_stat_activity;概要
実行中のすべてのVACUUM(autovacuumワーカーまたは手動)について、表、フェーズ、スキャン/vacuum済みのヒープの割合、インデックスvacuumのパス数、待機イベントを表示する。稼働中のautovacuumワーカー数も表示する。
使用する場面
大きな表のVACUUMがいつ終わるか、すべてのautovacuumワーカーが使用中か(キューで待機している表)、vacuumがスロットリングにより待機しているかを見積もるため。
注意
index_vacuum_count > 1は、デッドタプルのリストがメモリに収まらず、インデックスが複数回スキャンされたことを意味する。maintenance_work_mem/autovacuum_work_memを引き上げる(PG17より前は、この用途に最大1GBまでしか使用されない)。wait = Timeout:VacuumDelayはコストベースのスロットリング(autovacuum_vacuum_cost_delay/cost_limit)。クエリテキストに'to prevent wraparound'とあるautovacuumは終了させない。直ちに再起動する。VACUUM FULLとCLUSTERはこのビューではなくpg_stat_progress_clusterに表示される。