

# Aurora PostgreSQL 実行計画のキャプチャ
<a name="AuroraPostgreSQL.Optimize.CapturePlans"></a>

Aurora PostgreSQL クエリプラン管理には、自動と手動の 2 つの異なるクエリ実行計画のキャプチャモードが用意されています。`apg_plan_mgmt.capture_plans_baselines` を `automatic` に、または `manual` に設定してモードを選択します。特定の SQL ステートメントの実行計画を取り込むには、手動計画取り込みを使用します。または、自動計画取り込みを使用して、アプリケーションの実行時に 2 回以上実行されるすべての (または最も遅い) 計画を取得することもできます。

オプティマイザは計画取り込み時に、管理ステートメントの初期に取得された計画のステータスを `approved` に設定します。オプティマイザは、管理ステートメント用に取得されたすべての追加の計画のステータスを `unapproved` に設定します。ただし、複数の計画が `approved` ステータスで保存される場合があります。例えば、1 つのステートメントに対して複数の計画が並行して作成された場合や、そのステートメントの初期の計画がコミットされる前に発生する可能性があります。

`dba_plans` ビューに取得して保管できる計画の最大数を制御するには、DB インスタンスレベルのパラメータグループで `apg_plan_mgmt.max_plans` パラメータを設定します。`apg_plan_mgmt.max_plans` パラメータを変更した場合、新しい値を有効にするために DB インスタンスを再起動する必要があります。詳細については、[apg\$1plan\$1mgmt.max\$1plans](AuroraPostgreSQL.Optimize.Parameters.md#AuroraPostgreSQL.Optimize.Parameters.max_plans) パラメータを参照してください。

## 特定の SQL ステートメントの計画の手動取り込み
<a name="AuroraPostgreSQL.Optimize.CapturePlans.Manual"></a>

管理が必要な既知の SQL ステートメントがある場合は、ステートメントを SQL スクリプトファイルに入れてから、手動で計画を取得します。以下は、一連の SQL ステートメントに対してクエリ計画を手動で取得する方法を psql を例にとって示しています。

```
psql> SET apg_plan_mgmt.capture_plan_baselines = manual;
psql> \i my-statements.sql 
psql> SET apg_plan_mgmt.capture_plan_baselines = off;
```

各 SQL ステートメントに対して計画を取得した後、オプティマイザは `apg_plan_mgmt.dba_plans` ビューに新しい行を追加します。

EXPLAIN ステートメントまたは EXPLAIN EXECUTE ステートメントを SQL スクリプトファイルで使用することをお勧めします。対象となるすべての計画の取り込みに十分なバリエーションがパラメータ値に含まれていることを確認します。

オプティマイザの最小コスト計画よりも優れた計画がある場合は、オプティマイザでその優れた計画が使用されるようになります。そのためには、オプティマイザのヒントを 1 つ以上指定します。詳細については、「[pg\$1hint\$1plan を使用した計画の修正](AuroraPostgreSQL.Optimize.Maintenance.md#AuroraPostgreSQL.Optimize.Maintenance.pg_hint_plan)」を参照してください。`unapproved` 計画と `approved` 計画のパフォーマンスを比較して、承認、拒否、または削除する方法については、「[計画パフォーマンスの評価](AuroraPostgreSQL.Optimize.Maintenance.md#AuroraPostgreSQL.Optimize.Maintenance.EvaluatingPerformance)」を参照してください。

## 自動的な計画の取得
<a name="AuroraPostgreSQL.Optimize.CapturePlans.Automatic"></a>

以下のような状況では、自動計画キャプチャを使用します。
+ 管理する特定の SQL ステートメントが分からない場合。
+ 管理対象となる SQL ステートメントが数百、数千ある場合。
+ ユーザーのアプリケーションがクライアント API を使用している場合。例えば、JDBC では、psql では表現できない、名前のない準備済みステートメントまたは一括モードのステートメントを使用します。

**自動的に計画を取得するには**

1. DB インスタンスレベルのパラメータグループで `apg_plan_mgmt.capture_plan_baselines` を `automatic` に設定して、自動計画取り込みをオンにします。詳細については、「[Amazon Aurora の DB パラメータグループのパラメータの変更](USER_WorkingWithParamGroups.Modifying.md)」を参照してください。

1. アプリケーションが実行されると、オプティマイザは少なくとも 2 回以上実行される各 SQL ステートメントの計画を取得します。

   デフォルトのクエリ計画管理パラメータ設定を使用してアプリケーションが実行されると、オプティマイザは少なくとも 2 回以上実行される各 SQL ステートメントの計画を取得します。デフォルト設定を使用してすべての計画を取り込むことで、実行時のオーバーヘッドを大幅に削減し、実稼働環境で有効にすることができます。

**自動計画取り込みをオフにするには**
+ DB インスタンスレベルのパラメータグループから `apg_plan_mgmt.capture_plan_baselines` パラメータを `off` に設定します。

未承認の計画のパフォーマンスを測定して、それらを承認、拒否、または削除する方法については、「[計画パフォーマンスの評価](AuroraPostgreSQL.Optimize.Maintenance.md#AuroraPostgreSQL.Optimize.Maintenance.EvaluatingPerformance)」を参照してください。