vacuum
VACUUM FULLはテーブルに排他ロックを必要とするうえ、処理に非常に長い時間を要します。そのため、VACUUM FULLの実行がサービス障害につながることもありえます。
VACUUM FULLが必要とならないよう、普段から適切にVACUUMが実行されるようにAUTO VACUUMのパラメータ調整や、各テーブルのVACUUM実行状況の監視が大切です。
autovacuum
例えば、1000万レコードを持つテーブルの場合は、デフォルトでの閾値は50+1000万*0.2=200万50レコードとなります。つまり、UPDATEやDELETEで200万50レコードが発生したテーブルがautovacummのVACUUM処理の対象となります。
autovacuumのチューニング要素について考えてみる - Qiita 2021
autovacuum_vacuum_scale_factor
autovacuum_vacuum_threshold のdefaultは50、autovacuum_vacuum_scale_factor のdefaultは0.2。 問題となっているテーブルには2億件以上のレコードが格納されており、ざっくりいうと、4000万件以上の更新/削除が発生しないと、AUTO VACUUMがtriggerされない状況になってしまっていた。
Postgresql サーバを移行したらAUTO VACUUM が実行されず、データベースが肥大化した時の話 - Qiita
0.05 5%
SELECT relname, n_live_tup, n_dead_tup, CASE n_dead_tup WHEN 0 THEN 0 ELSE round(n_dead_tup*100/(n_live_tup+n_dead_tup) ,2) END AS ratio FROM pg_stat_user_tables ;
VACUUMの進捗状況を確認する
VACUUMの進捗状況を確認します。VACUUM FULLはサポートされません。# select v.pid, v.datname, c.relname, v.phase, v.heap_blks_total, v.heap_blks_scanned, v.heap_blks_vacuumed, v.index_vacuum_count, v.max_dead_tuples, v.num_dead_tuples from pg_stat_progress_vacuum as v join pg_class as c on v.relid = c.relfilenode;
autovacuum バージョン
PostgreSQL8.3からデフォルトでautovacuumが有効になり、vacuum analyzeとかしなくてもよくなりましたが、8.2までの場合は気にしないといけません。
バキュームのバージョンごとの差異
http://ja.wikipedia.org/wiki/PostgreSQL