postgres vacuum

vacuum

VACUUM FULLはテーブルに排他ロックを必要とするうえ、処理に非常に長い時間を要します。そのため、VACUUM FULLの実行がサービス障害につながることもありえます。
VACUUM FULLが必要とならないよう、普段から適切にVACUUMが実行されるようにAUTO VACUUMのパラメータ調整や、各テーブルのVACUUM実行状況の監視が大切です。

PostgreSQL VACUUM で年末大掃除 | TECHSCORE BLOG

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 ;

postgreSQL で不要領域の比率を出すクエリ - ritchiekotzen's blog

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;

自動VACUUMの状況を確認する - Qiita 2020

autovacuum バージョン

PostgreSQL8.3からデフォルトでautovacuumが有効になり、vacuum analyzeとかしなくてもよくなりましたが、8.2までの場合は気にしないといけません。

【PostgreSQL】チューニングとautovacuum

バキュームのバージョンごとの差異
http://ja.wikipedia.org/wiki/PostgreSQL

PostgreSQLで実行中のautovacuumを停止する方法 2017