lvncerpedia

VACUUM Command

PostgreSQLのVACUUMコマンドは、データベースのメンテナンスに不可欠な機能です。 主に、不要領域の回収とトランザクションID(XID)の周回問題の防止という2つの重要な役割を担います。

VACUUMの主な機能

  • 不要領域の回収 PostgreSQLでは、UPDATEやDELETEで不要になった行(デッドタプル)は、すぐには物理的に削除されません。 VACUUMはこれらのデッドタプルを整理し、再利用可能な領域としてマークします。 これにより、テーブルやインデックスの肥大化を防ぎ、パフォーマンスの低下を抑制します。
  • トランザクションIDの周回問題の防止 PostgreSQLはトランザクションID(XID)を使用してデータの可視性を管理しています。 XIDは有限な数値であるため、いずれ一周してしまいます。 VACUUMは古いトランザクションIDを「凍結(freeze)」することで、この周回問題を防ぎ、データベースが読み取り専用になるのを回避します。

VACUUMの主なオプション

VACUUMにはいくつかのオプションがあり、それぞれ目的が異なります。

VACUUM (通常)

デッドタプルが占めていた領域を再利用可能にしますが、OSにディスク領域を返却しません。 テーブルへの排他ロックを取得しないため、通常の読み書き操作と並行して実行できます。 日常的なメンテナンスには、この通常のVACUUMが推奨されます。

VACUUM FULL

テーブルを完全に再構築し、不要な領域をOSに返却してディスク使用量を物理的に削減します。 テーブルに対して強力な排他ロックをかけるため、処理中は他のすべての操作(SELECTも含む)がブロックされます。 処理に時間がかかり、一時的にディスク容量を追加で必要とするため、頻繁な使用は推奨されません。 テーブルから大量のデータを削除した後など、ディスク領域を物理的に解放したい場合に限定して使用します。

VACUUM ANALYZE

VACUUM処理の後にANALYZEコマンドを実行します。 ANALYZEは、テーブルのデータ分布に関する統計情報を更新するコマンドです。この統計情報は、クエリプランナが最適な実行計画を作成するために使用されます。 VACUUMとANALYZEを同時に行うことで、メンテナンスを効率化できます。

VACUUM FREEZE

より積極的にタプルのトランザクションIDを凍結します。 通常は自動バキューム(autovacuum)によって適切に処理されるため、手動でこのオプションを使用することは稀です。

VACUUMとREINDEXの違い

VACUUMとREINDEXはどちらもデータベースのメンテナンスコマンドですが、目的が異なります。

コマンド目的処理内容
VACUUM不要領域の回収と再利用、XID周回問題の防止デッドタプルを整理し、再利用可能な領域としてマークする。
REINDEXインデックスの性能劣化の解消インデックスを物理的に再構築し、断片化を解消する。

VACUUMはテーブル内の不要な行を整理し、REINDEXはインデックスそのものを再構築します。 インデックスの性能が劣化した場合はREINDEXが必要ですが、日常的なテーブルのメンテナンスにはVACUUM(特に自動バキューム)が重要です。

PostgreSQLでは、autovacuumというデーモンがバックグラウンドで自動的にVACUUMとANALYZEを実行してくれるため、多くの場合、手動でVACUUMを実行する必要はありません。 しかし、大量のデータ更新や削除を行った後など、必要に応じて手動でVACUUMを実行することで、データベースの健全性を保つことができます。