管理計画の使用 - Amazon Aurora

管理計画の使用

オプティマイザが管理ステートメントに対して取り込んだ計画を使用するには、パラメータ apg_plan_mgmt.use_plan_baselinestrue に設定します。以下はローカルインスタンスの例です。

SET apg_plan_mgmt.use_plan_baselines = true;

この設定により、アプリケーションの実行中、オプティマイザでは、管理ステートメントごとに最小コストの計画、推奨される計画または承認済み計画が使用されるようになります。

オプティマイザが実行する計画を選択する方法。

実行計画のコストは、オプティマイザが異なる計画を比較するために行う見積もりです。オプティマイザのコストは、計画で使用される CPU および I/O 操作を含む、いくつかの要因からなる関数です。PostgreSQL クエリプランナーのコストの詳細については、「クエリ計画についての PostgreSQL のドキュメント」を参照してください。

次のフローチャートは、クエリ計画管理オプティマイザがどの計画を実行するかを選択する方法を示しています。


                    クエリ計画管理のワークフロー

フローは次のとおりです。

  1. オプティマイザがすべての SQL ステートメントを処理するとき、最小コストの計画が生成されます。

  2. クエリ計画管理がなければ、オプティマイザは生成された計画のみを実行します。次のパラメータ設定の一方または両方を設定した場合、オプティマイザはクエリ計画管理を使用します。

    • apg_plan_mgmt.capture_plan_baselines から manual へ、または automatic

    • apg_plan_mgmt.use_plan_baselinestrue

  3. 以下の両方が当てはまる場合に、オプティマイザは生成された計画を即座に実行します。

    • オプティマイザの計画は既に SQL ステートメントの apg_plan_mgmt.dba_plans ビューにあります。

    • 計画のステータスは、approved または preferred です。

  4. パラメータ apg_plan_mgmt.capture_plan_baselinesmanual または automatic の場合、オプティマイザは取り込み計画処理を行います。

    オプティマイザが計画を取り込む方法の詳細については、「実行計画の取得」を参照してください。

  5. apg_plan_mgmt.use_plan_baselinesfalse の場合、オプティマイザは生成された計画を実行します。

  6. オプティマイザの計画が apg_plan_mgmt.dba_plans ビューにない場合、オプティマイザは新しい unapproved 計画として計画を取り込みます。

  7. 以下の両方が当てはまる場合に、オプティマイザは生成された計画を実行します。

    • オプティマイザの計画は、rejecteddisabled 計画ではありません。

    • 計画の合計コストは、未承認の実行計画のしきい値を下回ります。

    オプティマイザは、無効化された計画やステータスが拒否になっている計画は実行しません。ほとんどの場合、オプティマイザは未承認の計画を実行しません。ただし、パラメータ apg_plan_mgmt.unapproved_plan_execution_threshold に値を設定しており、計画の合計コストがしきい値を下回る場合、オプティマイザは未承認の計画を実行します。詳細については、apg_plan_mgmt.unapproved_plan_execution_threshold パラメータを参照してください。

  8. 管理ステートメントに、有効化された計画や、有効で推奨される計画がある場合、オプティマイザーは最小コストの計画を実行します。

    有効な計画とは、オプティマイザが実行可能な計画です。管理された計画は、さまざまな理由で利用不可能になることがあります。例えば、依存しているオブジェクト (インデックスまたはパーティショニングされたテーブルのパーティションなど) が削除されると、計画は利用不可能になります。

  9. オプティマイザは、利用可能かつ有効な管理ステートメントの承認済み計画から最小コスト計画を決定します。その後、オプティマイザは最小コストの承認済み計画を実行します。

オプティマイザが使用する計画の分析

apg_plan_mgmt.use_plan_baselines パラメータが true に設定されていれば、EXPLAIN ANALYZE SQL ステートメントを使用して、オプティマイザがステートメントを実行する場合に使用する計画を表示することができます。次に例を示します。

EXPLAIN ANALYZE EXECUTE rangeQuery (1,10000);
QUERY PLAN -------------------------------------------------------------------------- Aggregate (cost=393.29..393.30 rows=1 width=8) (actual time=7.251..7.251 rows=1 loops=1) -> Index Only Scan using t1_pkey on t1 t (cost=0.29..368.29 rows=10000 width=0) (actual time=0.061..4.859 rows=10000 loops=1) Index Cond: ((id >= 1) AND (id <= 10000)) Heap Fetches: 10000 Planning time: 1.408 ms Execution time: 7.291 ms Note: An Approved plan was used instead of the minimum cost plan. SQL Hash: 1984047223, Plan Hash: 512153379

オプティマイザはどの計画を実行するかを示しますが、この例ではより低コストの計画が見つかったことが分かります。この場合、自動的な計画の取得 で説明されているように自動計画取り込みをオンにして、この新しい最小コスト計画を取得します。

オプティマイザは、新しい計画を Unapproved としてキャプチャします。計画を比較し、それらを承認済み、拒否、または無効に変更するには、apg_plan_mgmt.evolve_plan_baselines 関数を使用します。詳細については、「計画パフォーマンスの評価」を参照してください。