バキュームと自動バキュームの目的について説明する

完了

行が更新されるとき、各更新は挿入と削除で構成されます。 変更されたデータが挿入されて、古い行が削除されます。 PostgreSQL では、問題が発生した場合にトランザクションをロールバックできるように、元の行が保持されます。 元の行は削除されるのではなく、後で削除する対象としてマークされ、ディスクにまだ残ってはいても必要ではなくなった "無効" 行 (またはタプル) になります。

適切な名前のバキューム プロセスは、これらの行を完全に削除し、他の方法では失われる可能性のある領域を回収して、統計を更新します。

無効行をクリーンアップするプロセスは、バキューム プロセスと呼ばれます。 これらの行がディスク上に残っている場合、データベースは必要な量より多くのディスク領域を占有しています (データベースの "肥大化" と呼ばれます)。VACUUM プロセスは、次の理由で重要です。

  • 削除対象としてマークされた行によって占有されているディスク領域を回復するため。
  • クエリ プランナーが使用するデータ統計を更新するため。
  • インデックスのみのスキャンを高速化する可視性マップを更新するため。
  • トランザクション ID のラップアラウンドにより古いデータが失われるのを防ぐため。

PostgreSQL は、バキュームと呼ばれるプロセスを使って、行を完全に削除し、領域を回収します。 領域を回収するだけでなく、インデックスの有効性も保証します。

自動的にトリガーされるバキューム プロセスは、自動バキュームと呼ばれます。 プロセスを実行する必要がある頻度は、更新と削除の操作量によって異なります。 削除対象としてマークされた行の数を監視することもできます。

バキューム プロセスを定期的に実行すると、次のようにならないことが保証されます。

  • 必要以上のデータベースやテーブルを含む "肥大化" が発生する。
  • インデックスが大きくて、最適ではなくなる。
  • I/O が増加する。

テーブル内の "無効" 行の数を監視するには、SELECT クエリを実行します。

SELECT relname, n_dead_tup, n_live_tup
FROM pg_catalog.pg_stat_all_tables
ORDER BY n_dead_tup DESC;

バキューム プロセスを手動で実行するには、次のように入力します。

vacuum