PostgreSQLのvacuumとvacuum fullの違い

vacuum fullは、vacuumの上位版のような名前だがやってることは全然違うよ。というのとvacuum fullの動作はPostgreSQL9系ではアルゴリズムが一新されており若干動作が異なるようです。

VACUUM FULLはそれが作用する全てのテーブルに対し排他ロックを必要とするので、それらテーブルのその他の用途と並行して行うことはできません。

http://www.postgresql.jp/document/9.2/html/routine-vacuuming.html

標準形式のVACUUMは、テーブルとインデックス内の不要な行を削除し、その領域を将来の再利用が可能であるものとして記録します。 しかし、その領域をオペレーティングシステムに返却することはありません。 例外として、テーブルの末尾に完全に空のページが存在し、かつそのテーブルの排他ロックが容易に獲得できるような特殊な場合には、その領域を返却します。 対照的にVACUUM FULLは、不要な領域のない全く新しいバージョンのテーブルファイルを書き出すことで、積極的にテーブルを圧縮します。 テーブルの容量を最小化しますが、長い時間がかかる可能性があります。 また操作が終わるまで、テーブルの新しいコピー用に余計なディスク領域を必要とします。

http://www.postgresql.jp/document/9.2/html/routine-vacuuming.html


日常的なメンテナンスの際に用いるのはvacuumを利用すべきで、ディスク使用量を下げなければならないような緊急性のある問題が発生した場合にはvacuum fullを実施する。


v9.0以前は、ディスク容量が限界ぎりぎりでも実行することができたがそれができなくなったと。

VACUUM FULL の高速化
VACUUM FULL のアルゴリズムが改められ、ゴミが多い場合の処理が大幅に高速化されました。一方、ゴミが少ない場合にはむしろ遅くなっているので、「毎晩 vacuumdb --full」するような運用は改める必要があります。また、処理中に元のテーブルと同じサイズの一時ディスク領域が必要になったため、ディスクフル間近の場合は実行できなくなりました。

PostgreSQL 9.0 の新機能 | Let's POSTGRES