VACUUM と autovacuum
PostgreSQL の VACUUM の役割とは?
VACUUM は、更新や削除の後に残る不要な行バージョンが占める領域を回収し、可視性マップを更新して、トランザクション ID の周回(wraparound)を防ぎます。autovacuum がこれを自動で実行します。
MVCC のため、PostgreSQL の UPDATE や DELETE は古い行バージョンをすぐには削除しません。古いバージョンは、どのトランザクションからも参照されなくなった時点でデッドタプルになります。VACUUM はデッドタプルを見つけ、その領域を同じテーブルの新しい行で再利用できるようにします。
通常の VACUUM は通常の読み書きと並行して実行され、一般にディスク上のテーブルファイルを縮小しません。VACUUM FULL はテーブルを書き直して領域をオペレーティングシステムに返しますが、その間ずっと排他ロックを取得します。VACUUM はインデックスオンリースキャンに役立つ可視性マップも更新し、古い行を凍結(freeze)してトランザクション ID の周回を防ぎます。autovacuum デーモンが VACUUM と ANALYZE を自動的に実行するため、手動での実行が主に役立つのは大規模な一括変更の後です。
例
この例では、テーブルの全行を更新して 10,000 個の不要な行バージョンを発生させ、VACUUM (VERBOSE) を実行して何を回収したかを報告させます。その後の統計情報クエリでは、テーブルが最後に手動で VACUUM された日時を確認できます。
CREATE TABLE items (id int PRIMARY KEY, qty int);
INSERT INTO items SELECT g, 0 FROM generate_series(1, 10000) AS g;
UPDATE items SET qty = qty + 1;
VACUUM (VERBOSE) items;
SELECT relname, last_vacuum, n_dead_tup
FROM pg_stat_user_tables
WHERE relname = 'items';拡張機能なしの標準の PostgreSQL 16 または 17 で動くプレーンな SQL です。破棄してかまわない空のデータベースで実行してください。
出典
PostgreSQL 公式ドキュメント(英語)。