PostgreSQLの文書を見ると、どれも基本的にはVACUUM FULLは使うなと書いてある。
作用する全てのテーブルを排他ロックするし、おまけにインデックスが肥大化するのでREINDEXも必要になる。尚、REINDEXもそのインデックスを使用する読み込みはブロックする。
なので以下のような状況の時に初めてVACUUM FULLを検討すべき。
- DBサーバのディスク容量が逼迫している
- ほとんど更新がなくなって放置されているテーブルである(外部キーとして参照したりされたりしていないこと。ロックの影響を受けそう。要確認)
例えば、アンケートの回答を保持しているアンケート毎のテーブルなど(回答はUPDATEにてテーブルに保持)。基本、アンケートは締め切りが来てしまえばそれ以降に回答が集まることはないため、参照されそうな時間を避けてVACUUM FULL、REINDEXを行う。
参考
https://wiki.postgresql.org/wiki/VACUUM_FULL/ja
https://www.postgresql.jp/document/9.2/html/routine-vacuuming.html
http://dqn.sakusakutto.jp/2011/11/postgresql-reindex.html