5. パフォーマンス関連
5.2 自動 VACUUM
5.2.1 タイミング
自動 VACUUM 処理は autovacuum launcher プロセスから起動される autovacuum
worker プロセスが行います。autovacuum worker プロセスの起動間隔は、パラメーター
autovacuum_naptime(デフォルト1min)で決まります。
5.2.2 条件
自動 VACUUM は、以下の計算式で取得された値と、更新されて不要になったレコード
数を比較して決定されます。不要になったレコード数は基本的にはUPDATE / DELETE文 により更新されたレコード数に一致しますが、同一レコードを複数回UPDATEした場合に は更新レコード数にカウントされない場合があります。これはHOTによる再利用のためと 想定されますが、ソースコードの確認までは実施していません。条件のチェックは、ソース コード(src/backend/postmaster/autovacuum.c)内のrelation_needs_vacanalyze関数で 行っています。
計算式 5 自動VACUUM閾値
上記計算式の意味は以下の通りです。
autovacuum_vacuum_threshold
パラメーターautovacuum_vacuum_thresholdの値(デフォルト値50)またはテー ブルのautovacuum_vacuum_threshold属性の値です。
autovacuum_vacuum_scale_factor
パラメーターautovacuum_analyze_scale_factorの値(デフォルト値0.2 = 20%)
または、テーブルのautovacuum_analyze_scale_factor属性の値です。
reltuples
前回統計情報を取得した時点のテーブルの有効レコード数です。pg_classカタログ
のreltuples列で確認できます。
5.2.3 autovacuum worker プロセス起動
実際のVACUUM処理は定期的に起動されるautovacuum workerプロセスが行います。
autovacuum workerプロセスはpostmasterプロセスの子プロセスになります。
閾値 = autovacuum_vacuum_threshold +
autovacuum_vacuum_scale_factor * reltuples
VACUUMが必要になるテーブルは「autovacuum_naptimeパラメーター / 変更があっ たデータベース数」の間隔でチェックされ、前述の閾値を超える不要レコードが存在するテ ーブルが見つかるとautovacuum worker プロセスが起動されます。autovacuum worker プロセスは対象データベース内のVACUUM処理を完了すると停止します。
VACUUM対象のテーブルが、複数のデータベースに存在する場合、それぞれのデータベ
ースに対してautovacuum workerプロセスが起動します。
次 回 の チ ェ ッ ク 間 隔 で ま だ VACUUM 対 象 の テ ー ブ ル が 存 在 す る 場 合 、 新 た に
autovacuum workerプロセスを起動してVACUUM処理を行います。autovacuum worker
プロセスの最大値はautovacuum_max_workers(デフォルト3)で制限されます。最大値 に 到 達 し て も ロ グ は 出 力 さ れ ま せ ん 。 自 動 VCAUUM の 実 行 状 況 は 、
pg_stat_progress_vacuum カタログで確認できます。ただし、VACUUM 処理実行中のみ
レコードが検索できます。
例 130 pg_stat_progress_vacuumカタログの検索
5.2.4 使用メモリー容量
自動 VACUUM の処理に使用するメモリー領域のサイズ計算を制御するパラメーターが
autovacuum_work_memです。常にこのパラメーターで指定された値が使用される訳では
なく、パラメーター値を基にした計算値が使用されます。
このパラメーターのデフォルト値は-1 です。デフォルト値の場合、パラメーター
maintenance_work_memの値を使用します。
postgres=# SELECT * FROM pg_stat_progress_vacuum ; -[ RECORD 1 ]---+---
pid | 3184 datid | 16385 datname | demodb relid | 16398
phase | scanning heap heap_blks_total | 10052
heap_blks_scanned | 2670 heap_blks_vacuumed | 2669 index_vacuum_count | 0 max_dead_tuples | 291 num_dead_tuples | 185
マニュアルには記載がありませんが、パラメーターの下限値は1024 (=1MB)です。-1以 外の値で、1MB未満の値を指定すると、パラメーター値は1MBに設定されます。