PostgreSQLデータベースに使用頻度の高いテーブル(約500万行)があり、その列を削除して、列が使用していたスペースを再利用したいと思います。
ドキュメントは、テーブルの書き換えを行うことをお勧めしますALTER TABLE
を使用してスペースを強制的に戻しますが、これはテーブルの使用中に実行するのは安全ではなく、ダウンタイムが発生します。ダウンタイムを必要としない実用的なオプションはありますか? pgcompact
ツールを実行しようとしましたが、何も変わりませんでした。
ALTER TABLE .. DROP COLUMN ...
システムテーブルで列を削除済みとしてマークします pg_attribute
。行がなんらかの方法で書き換えられるまで、テーブル自体は操作されません。ドロップ自体は非常に高速ですが、少し時間がかかりますACCESS EXCLUSIVE
ロック。私はそれを「ダウンタイム」とは呼びません。
実際にディスク領域を再利用するのは難しい部分です。コミュニティツール pg_repack
の代わりにVACUUM FULL
またはCLUSTER
(テーブルを排他的にロックします)。排他ロックは回避されますが、動作するにはディスクに空き領域が必要です。詳細:
または、テーブルの行が最終的に更新される場合は、それを待つだけです。すべての新しい行バージョンは、削除された列なしで書き込まれます。古い行バージョンがVACUUM
によって上書きまたは削除されると、スペースを取り戻します。