web-dev-qa-db-ja.com

ダウンタイムなしでドロップされた列からディスク領域を再利用

PostgreSQLデータベースに使用頻度の高いテーブル(約500万行)があり、その列を削除して、列が使用していたスペースを再利用したいと思います。

ドキュメントは、テーブルの書き換えを行うことをお勧めしますALTER TABLEを使用してスペースを強制的に戻しますが、これはテーブルの使用中に実行するのは安全ではなく、ダウンタイムが発生します。ダウンタイムを必要としない実用的なオプションはありますか? pgcompactツールを実行しようとしましたが、何も変わりませんでした。

9
viblo

ALTER TABLE .. DROP COLUMN ... システムテーブルで列を削除済みとしてマークします pg_attribute 。行がなんらかの方法で書き換えられるまで、テーブル自体は操作されません。ドロップ自体は非常に高速ですが、少し時間がかかりますACCESS EXCLUSIVEロック。私はそれを「ダウンタイム」とは呼びません。

実際にディスク領域を再利用するのは難しい部分です。コミュニティツール pg_repack の代わりにVACUUM FULLまたはCLUSTER(テーブルを排他的にロックします)。排他ロックは回避されますが、動作するにはディスクに空き領域が必要です。詳細:

または、テーブルの行が最終的に更新される場合は、それを待つだけです。すべての新しい行バージョンは、削除された列なしで書き込まれます。古い行バージョンがVACUUMによって上書きまたは削除されると、スペースを取り戻します。

12