• 検索結果がありません。

自動 VACUUM

ドキュメント内 PostgreSQL Internals (1) (ページ 155-158)

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に設定されます。

ドキュメント内 PostgreSQL Internals (1) (ページ 155-158)