翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
テーブルの自動バキューム処理と分析
Autovacuum は、デッドタプルのバキューム処理 (クリーンアップ)、ストレージの再利用、統計の収集を自動的に行うデーモン (バックグラウンドで実行されます) です。データベース内の肥大化したテーブルをチェックし、肥大化をクリアしてスペースを再利用します。データベーステーブルとインデックスをモニタリングし、特定の更新または削除オペレーションのしきい値に達した後にバキュームジョブに追加します。
Autovacuum はPostgreSQL VACUUM
および ANALYZE
コマンドを自動化することでバキューム処理を管理します。 はテーブルから肥大VACUUM
化を削除してスペースを再利用しますが、 はオプティマイザが効率的な計画を作成できるようにする統計ANALYZE
を更新します。 VACUUM
は、バキュームフリーズと呼ばれる主要なタスクも実行して、データベース内のトランザクション ID の循環の問題を防ぎます。データベースで更新されたすべての行は、PostgreSQL トランザクションコントロールメカニズムからトランザクション ID を受け取ります。これらの IDsは、他の同時トランザクションに対する行の可視性を制御します。トランザクション ID は 32 ビット番号です。20 億IDs は、常に目に見える過去に保持されます。残りの (約 22 億) IDs は、今後行われるトランザクションに対して保持され、現在のトランザクションからは非表示になります。PostgreSQL では、新しいトランザクションの作成時にトランザクションがラッピングされ、既存の古い行が非表示にならないようにするために、古い行のクリーニングとフリーズが必要になることがあります。詳細については、PostgreSQL ドキュメントの「トランザクション ID 循環の失敗を防ぐ
Autovacuum が推奨され、デフォルトで有効になっています。そのパラメータには以下が含まれます。
パラメータ |
説明 |
Amazon RDS のデフォルト |
Aurora のデフォルト |
|
autovacuum がテーブルをバキューム処理する前にテーブルで実行する必要があるタプルの更新または削除オペレーションの最小数。 |
50 オペレーション |
50 オペレーション |
|
autovacuum がテーブルを分析する前にテーブルで発生する必要があるタプルの挿入、更新、または削除の最小数。 |
50 オペレーション |
50 オペレーション |
|
autovacuum がテーブルをバキュームする前にテーブルで変更する必要があるタプルの割合。 |
0.1 |
0.1 |
|
autovacuum が分析する前にテーブルで変更する必要があるタプルの割合。 |
0.05 |
0.05 |
|
トランザクション IDs の循環の問題を防ぐため、テーブルがバキューム処理される前のフリーズ ID の最大有効期間。 |
200,000,000 件のトランザクション |
200,000,000 件のトランザクション |
Autovacuum は、次のように、特定のしきい値式に基づいて処理するテーブルのリストを作成します。
-
テーブル
VACUUM
で を実行するためのしきい値:vacuum threshold = autovacuum_vacuum_threshold + (autovacuum_vacuum_scale_factor * Total row count of table)
-
テーブル
ANALYZE
で を実行するためのしきい値:analyze threshold = autovacuum_analyze_threshold + (autovacuum_analyze_scale_factor * Total row count of table)
中小規模のテーブルの場合、デフォルト値で十分です。ただし、頻繁にデータを変更する大きなテーブルでは、デッドタプルの数が多くなります。この場合、autovacuum はメンテナンスのためにテーブルを頻繁に処理し、大きなテーブルが終了するまで他のテーブルのメンテナンスが遅延または無視される可能性があります。これを回避するには、次のセクションで説明する autovacuum パラメータを調整できます。
Autovacuum メモリ関連のパラメータ
autovacuum_max_workers
同時に実行できる autovacuum プロセス (autovacuum ランチャーを除く) の最大数を指定します。このパラメータは、サーバーを起動するときにのみ設定できます。自動バキュームプロセスが大きなテーブルでビジー状態の場合、このパラメータは他のテーブルのクリーンアップを実行するのに役立ちます。
maintenance_work_mem
VACUUM
、、 CREATE INDEX
などのメンテナンスオペレーションで使用されるメモリの最大量を指定しますALTER
。Amazon RDS と Aurora では、式 を使用してインスタンスクラスに基づいてメモリが割り当てられますGREATEST({DBInstanceClassMemory/63963136*1024},65536)
。autovacuum を実行する場合、その計算値を最大 autovacuum_max_workers
回割り当てることができるため、値を高く設定しすぎないように注意してください。これを制御するには、 をautovacuum_work_mem
個別に設定できます。
autovacuum_work_mem
各 autovacuum ワーカープロセスで使用されるメモリの最大量を指定します。このパラメータのデフォルトは -1 で、maintenance_work_mem
代わりに の値を使用する必要があることを示します。
autovacuum メモリパラメータの詳細については、Amazon RDS ドキュメントの「autovacuum のメモリの割り当て」を参照してください。
autovacuum パラメータのチューニング
ユーザーは、更新および削除オペレーションに応じて autovacuum パラメータを調整する必要がある場合があります。次のパラメータの設定は、テーブル、インスタンス、またはクラスターレベルで設定できます。
クラスターまたはインスタンスレベル
例として、継続的データ操作言語 (DML) オペレーションが予想される銀行データベースを見てみましょう。データベースの状態を維持するには、Aurora のクラスターレベルと Amazon RDS のインスタンスレベルで autovacuum パラメータを調整し、リーダーにも同じパラメータグループを適用する必要があります。フェイルオーバーの場合、同じパラメータを新しいライターに適用する必要があります。
テーブルレベル
たとえば、 という 1 つのテーブルで継続的な DML オペレーションが予想される食品配信用のデータベースではorders
、次のコマンドを使用して autovacuum_analyze_threshold
パラメータをテーブルレベルで調整することを検討する必要があります。
ALTER TABLE <table_name> SET (autovacuum_analyze_threshold = <threshold rows>)
テーブルレベルで積極的な自動バキューム設定を使用する
継続的な更新および削除オペレーションを含むサンプルorders
テーブルは、デフォルトの autovacuum 設定のためにバキューム処理の候補になります。これにより、計画の生成が悪くなり、クエリが遅くなります。肥大化をクリアして統計を更新するには、テーブルレベルの積極的な自動バキューム設定が必要です。
設定を決定するには、このテーブルで実行されているクエリの期間を追跡し、計画の変更につながる DML オペレーションの割合を特定します。pg_stat_user_tables
ビューは、挿入、更新、削除オペレーションを追跡するのに役立ちます。
例:
オプティマイザがorders
テーブルの 5% が変更されるたびに不正なプランを生成すると仮定します。この場合、次のようにスケール係数のしきい値を 2% に変更する必要があります。
ALTER TABLE orders SET (autovacuum_vacuum_scale_factor = 0.02)
ヒント
リソースの大量消費を避けるため、積極的な自動バキューム設定を慎重に選択します。
詳細については次を参照してください:
-
Amazon RDS for PostgreSQL 環境での autovacuum について
(AWS ブログ記事) -
自動バキューム処理
(PostgreSQL ドキュメント) -
Amazon RDS および Amazon Aurora での PostgreSQL パラメータのチューニング (AWS 規範ガイダンス)
自動バキュームが効果的に機能することを確認するには、デッド行、ディスク使用量、および最後に自動バキュームを実行した時間ANALYZE
を定期的にモニタリングします。pg_stat_all_tables
ビューには、各テーブル (relname
) に関する情報と、テーブルにあるデッドタプルの数 (n_dead_tup
) が表示されます。
各テーブル、特に頻繁に更新されるテーブルのデッドタプルの数をモニタリングすることで、自動バキュームプロセスがデッドタプルを定期的に削除しているかどうかを判断し、ディスク容量を再利用してパフォーマンスを向上させることができます。次のクエリを使用して、デッドタプルの数と、テーブルで最後の自動バキュームが実行された日時を確認できます。
SELECT relname AS TableName,n_live_tup AS LiveTuples,n_dead_tup AS DeadTuples, last_autovacuum AS Autovacuum,last_autoanalyze AS Autoanalyze_FROM pg_stat_user_tables;
利点と制限事項
Autovacuum には次の利点があります。
-
これにより、テーブルから肥大化が自動的に削除されます。
-
トランザクション ID の循環を防ぎます。
-
データベース統計を最新の状態に保ちます。
制限:
-
クエリが並列処理を使用する場合、ワーカープロセスの数は自動バキュームに十分ではない可能性があります。
-
自動バキュームがピーク時に実行されると、リソース使用率が増加する可能性があります。この問題を処理するには、パラメータを調整する必要があります。
-
テーブルページが別のセッションで占有されている場合、autovacuum はそれらのページをスキップすることがあります。
-
Autovacuum は一時テーブルにアクセスできません。