PostgreSQL:VACUUM
PostgreSQL
VACUUMとは
PostgreSQLでは、削除や更新によって不要となった領域はテーブルからは物理的には削除されていません。
それらを物理的に削除するためにVACUUMを実行する必要があります。
更新頻度にもよりますが、基本的には定期的にVACUUMを実行しておく必要があります。
なお、最近のバージョンでは自動的に VACUUM を実行することも可能となりましたが、仕掛け忘れ等もあるので、よほど性能用件が厳しくない限りは明示的に実行するようにしておいた方が無難かと思います。
VACUUMには、FULLオプションというものがあり、FULLオプション指定時にはテーブルを縮小させるための高度な処理を行ないます。
この場合には単なるVACUUMと比べてかなり低速になり、また、処理中のテーブルに対する排他的ロックが必要となります。
※単なるVACUUMだけでも以前は排他ロックが必要でしたが、最近のバージョンでは排他ロックされなくなりました。
VACUUMしないことによる問題
VACUUMを実行していないと、以下のような警告が出ることがあります。
WARNING: some databases have not been vacuumed in xxxxxxxxx transactions HINT: Better vacuum them within yyyyyyy transactions, or you may have a wraparound failure.
この状態ではまだサービス的には影響は出ませんが、上記の yyyyyyy 回のトランザクションを実行するまでに VACUUM しないと更新、削除ができなくなります。
template1 の VACCUM について
template1 というデフォルトで作成されるデータベースがあります。
このデータベース自体は明示的に使うことは通常無いのですが、このデータベースも VACUUM を行う必要があります。
詰まるところ、全てのデータベースに対して VACUUM を定期的に実行しておいた方が良いということになりますので、以下のように何も考えずに vacuumdb を実行しておくのが無難かと思います。
% /usr/local/pgsql/bin/vacuumdb -a
テーブルサイズの削減も考慮したい場合には、--full オプションでの実行も検討すると良いでしょう。