あなたがしていることにもかかわらず、あなたのテーブルは実際にディスク上で同じサイズのままDELETE
ですVACUUM
。のドキュメントにVACUUM
よると、通常VACUUM
は、ライブ行を再配置せずにファイルの末尾から空き領域を切り捨てることによって解放できる場合にのみ、OSに領域を解放します。
PostgreSQLが他の新しい行に再利用できるという点で、このスペースはまだ「空き」です。PostgreSQLがOSに返さなかったスペースを再利用する方が、新しいスペースとの関係を拡張するよりもはるかに高速であるため、多くの場合、これが望ましいです。
Pgがこのスペースを返すだけではないもう1つの理由は、ファイルの終わりまで行が表示されない連続したチャンクである場合にのみ、OSにスペースを戻すことができるためです。これはあまり起こらないので、実際には、Pgはテーブルを圧縮し、ファイルシステムのデフラグのように、最後にスペースを解放できるようにするために、いくつかの行を移動する必要があります。これは非効率的で遅いプロセスであり、直感に反してテーブルへのアクセスが速くなるのではなく遅くなる可能性があるため、常に良い考えとは限りません。
ほとんどが完全に空ではない関係がある場合は、VACUUM FULL
(Pg 9.0以降)またはCLUSTER
(すべてのバージョン)を実行してスペースを解放する価値があります。テーブルを補充することを期待している場合、これは通常逆効果です。実際にはそのままにしておく方が良いです。
(「ライブ」や「可視」などの用語の意味については、Pgのテーブル編成を理解するのに役立つMVCCのドキュメントを参照してください。)
個人的には、あなたの場合はマニュアルをスキップVACUUM
します。必要に応じて、自動真空をオンにします。本当に必要な場合は、テーブルをパーティション化して、パーティションごとに処理し、処理TRUNCATE
が完了したら各パーティションを処理することを検討できます。