VACUUM

PostgreSQLで、MVCCによりUPDATE/DELETEで発生した不要行(dead tuple)を回収するコマンド。物理削除されずに残った不要行を掃除する、ガベージコレクションに相当する役割を持つ。

#database #postgresql #vacuum

役割

VACUUMが担う主な役割は以下の3つ。

  • 不要行の回収: dead tupleが占有していた領域を再利用可能にする。放置するとテーブルが肥大化(bloat)する。
  • FREEZE(凍結): 古いタプルのXID(トランザクションID)をFrozenTransactionIdという特別な値に書き換える。凍結されたタプルはどのトランザクションから見ても「確定した非常に古いデータ」として扱われる。
  • 統計情報の更新: ANALYZEと組み合わせてクエリプランナ用の統計情報を最新化する。

AUTOVACUUM

VACUUMはユーザーが意識しなくても、バックグラウンドで動くautovacuumによって更新頻度に応じて自動実行される。

トランザクションID周回問題

PostgreSQLのXIDは有限のため、FREEZEせずに放置するとXIDが一周(wraparound)してデータが不可視になるおそれがある。これを防ぐため、autovacuum_freeze_max_ageパラメータでテーブルのrelfrozenxidの最大経過トランザクション数を制限しており、これを超えると強制的にVACUUMが走る。この「周回防止自動VACUUM」は、通常のautovacuum機能が明示的に無効化されていても動作する。

出典

作成日時: 2026-08-10 17:20 / 更新日時: 2026-08-10 17:20