« CGI::ApplicationでもCatalyst風にStash | メイン | ActionScriptでJSONみたいな事ができたらいいのに。 »

PostgreSQLのVACUUM FULLはいつ必要か。

毎晩VACUUM を行っているのだが、PostgreSQLの速度が極端に低下したことがあって、VACUUM FULLを行ったところ復旧した事がありました。それ以降、「定期的にサービスを停止してVACUUM FULLを行う」ということを話しているのを聞くんだけど実際のところどうなのか調べた。

間違っている事があれば指摘してください。

長いけどドキュメントから引用。

標準形式の VACUUM は、ディスク容量を安定状態の使用量のレベルで維持することを目的に最もよく使用されます。標準形式では、古いタプルを探し、その領域をそのテーブル内で再利用できるように変更します。 しかし、テーブルファイルを縮小させ、オペレーティングシステムにディスク容量を返却するといった難しいことは行ないません。ディスク容量をオペレーティングシステムに返却する必要がある場合は、VACUUM FULL コマンドを使用して下さい。 しかし、すぐに再度割り当てる必要があるディスク容量をリリースするポイントは何でしょうか?更新頻度の激しいテーブルの保守においては、不定期の VACUUM FULL よりも適切な頻度で標準の VACUUM の方がよりよい方法です。

適切な頻度で標準の VACUUM の方がよいとあって、次の段落でも

定常的なバキューム処理には、VACUUM FULL ではなく、普通の VACUUM を使用して下さい。

とある。

つまり、「VACUUM FULL」は通常やることではないと。いつ必要なのかと言えば、ディスク容量が増えすぎてしまったときと考えればいいのかな。自信ないけど。

そうであるならば、「ディスク容量」を監視すればいいと思う。増加のラインを見極めることができたら良いかな。ディスク容量の監視は、

du -sm /var/lib/pgsql/|perl -e '<>=~/^(\d+)/;print $1'

こんなようなコマンドで、SNMPとかを活用してグラフ化していったら良いと思われ。
毎日VACUUMをやっていれば極端に増え続けることがないだろうけど、、、。

これとは別に「ANALYZE」も実行すべきでしょうか?