Postgresqlの特徴として
削除処理は論理削除であり物理削除がされていないということがあります。
これはPostgresqlの中で論理削除フラグを持っており、
削除データもすべて保持しているという状況であり
更新処理とうが頻繁に行われるテーブルなどはキャッシュのようにゴミが堆積している状況になっています。
VACUUMはフラグのついているレコードを物理削除するコマンドになっており
これを用いて不要領域の解放、デフラグを行います。
VACUUM <オプション> <テーブル>;
で実行することができ
オプションなしかFULLかを選択することができます。
オプションがなしの場合はあくまで削除フラグのついているレコードを削除し
それらが占有していた領域を解放するにとどまります。
対してFULLの場合は
トランザクション処理が必要になりますが、テーブルの内容全体を更新するため
OS側に対して未使用の領域を返すことができます。
したがって処理は遅いですが、効果としてはわかりやすく変化が起きます。
Postgresqlの設定で自動でVACUUMを行ってくれるというものもあり
これを公式は推奨しているが、大容量データに対してこれを実行すると
定期的なパフォーマンス低下につながるため、
設定ファイルを参照して使用するデータ量に合わせて手動、自動を切り替える必要がある。