AnalyticDB for PostgreSQLは、バックグラウンドでテーブルに対してダーティデータのクリーンアップ操作を自動的に実行して、スキャンパフォーマンスの低下と、データの膨張によるトランザクションID (XID) のラップアラウンドの問題を防ぐことができます。 このトピックでは、自動真空プロセスの動作メカニズムと最適化パラメータについて説明します。
前提条件
2021年5月27日以降にリリースされたマイナーバージョンのAnalyticDB for PostgreSQLインスタンスが作成されます。 AnalyticDB For PostgreSQLインスタンスのマイナーバージョンを更新する方法については、「インスタンスのマイナーバージョンの更新」をご参照ください。
働くメカニズム
自動バキュームプロセスは、vacuumおよびVACUUM FREEZEステートメントを自動的に実行できます。 自動真空プロセスは、多数の挿入、更新、または削除が実行されるテーブルと、各テーブルのXID年齢を定期的にチェックします。 このプロセスは、必要に応じてテーブルに対してVACUUMまたはVACUUM FREEZE操作を実行し、テーブル内のダーティデータをクリーンアップしたり、XIDの経過時間を短縮してデータクエリを高速化したりします。
トリガー式
Number of dirty data rows > Number of table rows × Ratio threshold for triggering the auto-vacuum feature + Row number threshold for triggering the auto-vacuum featureテーブルに対して更新および削除を実行すると、ダーティデータを含む行数が増加します。 テーブルの行数は、テーブルの最後の分析から取得された行数です。 autovacuum_vacuum_scale_factorパラメーターを使用して、自動真空機能をトリガーするための比率のしきい値 (デフォルトは0.5) を指定できます。 autovacuum_vacuum_thresholdパラメーターを使用して、自動真空機能をトリガーするための行数のしきい値を指定できます。このしきい値はデフォルトで10000です。 デフォルトでは、テーブル内のダーティデータのサイズの合計サイズに対する比率が50% を超えると、自動真空機能が自動的にトリガーされてダーティデータがクリーンアップされます。
ロック競合
自動真空プロセスは、テーブル上の4レベルロックを保持します。 ビジネスプロセスが、自動真空プロセスによって保持されるロックと競合するロックを必要とする場合、自動真空プロセスは、ビジネスプロセスの実行を保証するためにロックを放棄する。
リソース使用量
自動真空プロセスは、実行中にCPUおよびI/Oリソースを使用しますが、リソースのボトルネックに達していない場合はパフォーマンスに影響しません。
自動真空プロセスに関する情報の照会
AnalyticDB for PostgreSQL V7.0で、次のステートメントを実行して、実行中の自動真空プロセスに関する情報を照会します。
SELECT * FROM pg_stat_activity WHERE backend_type = 'autovacuum worker';AnalyticDB for PostgreSQL V6.0で、次のステートメントを実行して、実行中の自動真空プロセスに関する情報を照会します。
SELECT * FROM pg_stat_activity WHERE query LIKE 'autovacuum%';自動真空機能が必要なクエリテーブル
SELECT schemaname, c.relname, c.reltuples, n_dead_tup, last_autovacuum, (n_dead_tup::float / c.reltuples::float)
AS bloat_ratio FROM pg_stat_all_tables s, pg_class c
WHERE c.oid = s.relid AND c.reltuples > 10000 AND (n_dead_tup::float > 10000 + c.reltuples::float * 0.5)
ORDER BY (n_dead_tup::float/ c.reltuples::float) DESC;パラメーター:
0.5: インスタンスレベルのautovacuum_vacuum_scale_factorパラメーターに指定された値。
10000: インスタンスレベルのautovacuum_vacuum_thresholdパラメーターに指定された値。
パラメーターの設定
インスタンスレベルのパラメーター
次の表に、変更可能なインスタンスレベルの自動真空パラメーターを示します。
パラメーター | 説明 | デフォルト値 |
autovacuum_naptime | 自動真空プロセスの2つの実行間の最小スケジューリング間隔。 単位は秒です。 | 60 |
autovacuum_vacuum_scale_factor | 自動真空機能をトリガーするためのデータサイズ比のしきい値。 ダーティデータをより頻繁にクリーンアップする場合は、このパラメーターを小さい値に設定します。 | 0.5 |
autovacuum_vacuum_threshold | 自動バキューム機能をトリガーするための更新または削除された行の最小数。 | 10000 |
autovacuum_freeze_max_age | XIDのラップアラウンドを防ぐために自動真空機能をトリガーするための最大XID年齢。 | 200,000,000 |
autovacuum_max_execute_workers | 同時自動真空タスクの最大数。 | max(3、cpucores/2) 、 cpucoresは、単一の計算ノード上のCPUコアの数です。 |
ほとんどの場合、インスタンスレベルの自動真空パラメーターを変更することはお勧めしません。 パラメーターの値を変更する場合は、チケットを起票してください。
テーブルレベルのパラメーター
自動真空パラメータの変更
次のステートメントを実行して、テーブルの自動真空パラメーターを変更します。
ALTER TABLE <test_table> SET (<autovaccum_options>=<expect_value>);パラメーター:
<test_table>: 自動真空パラメータを変更するテーブルの名前。<autovaccum_options>: 値を変更するテーブルレベルの自動真空パラメーター。<expect_value>: パラメーターの新しい値。
例
例1: テストテーブルの自動真空機能を無効にします。
ALTER TABLE test SET (autovacuum_enabled=false);テーブルの自動真空機能を無効にするには、autovacreum_enabledパラメーターをfalseに設定します。 自動真空機能を無効にするには、autovacuum_vacuum_scale_factorパラメーターの値を大きくすることを推奨します。
例2: 自動真空機能をトリガーするための比率のしきい値を80% に上げます。
ALTER TABLE test SET (autovacuum_vacuum_scale_factor=0.8);自動真空パラメータを復元する
次のステートメントを実行して、テーブルの自動真空パラメーターをインスタンスのデフォルトの自動真空パラメーター値に復元します。
ALTER TABLE <test_table> RESET (<autovaccum_options>);例
自動真空機能をトリガーするための比率のしきい値をデフォルト値に戻します。
ALTER TABLE test RESET (autovacuum_vacuum_scale_factor);変更可能なテーブルレベルのパラメーター
パラメーター | 説明 |
autovacuum_vacuum_scale_factor | 自動真空機能をトリガーするためのデータサイズ比のしきい値。 |
autovacuum_vacuum_threshold | 自動バキューム機能をトリガーするための更新または削除された行の最小数。 |