

# Aurora PostgreSQL クエリ計画管理
<a name="AuroraPostgreSQL.Optimize.Start"></a>

Aurora PostgreSQL DB クラスターのクエリプラン管理を有効にすると、オプティマイザは複数回処理する SQL ステートメントのクエリ実行計画を生成して保存します。オプティマイザは、マネージドステートメントの初期に生成された計画のステータスを常に `Approved` に設定し、`dba_plans` ビューに保存します。

管理ステートメントの一連の承認済み計画は、*計画ベースライン*と呼ばれます。アプリケーションが実行されると、オプティマイザが管理ステートメントに追加の計画を生成することがあります。オプティマイザは、追加でキャプチャされた計画を `Unapproved` ステータスに設定します。

後で、`Unapproved` 計画が正常に機能するかどうかを確認し、`Approved`、`Rejected`、または `Preferred` に変更できます。そのためには、`apg_plan_mgmt.evolve_plan_baselines` 関数または `apg_plan_mgmt.set_plan_status` 関数を使用します。

オプティマイザが SQL ステートメントの計画を生成すると、クエリプラン管理はその計画を `apg_plan_mgmt.plans` テーブルに保存します。`apg_plan_mgmt` ロールが付与されたデータベースユーザーは、`apg_plan_mgmt.dba_plans` ビューをクエリすることで計画の詳細を確認できます。例えば、次のクエリでは、本番環境以外の Aurora PostgreSQL DB クラスターのビューに現在表示されている計画の詳細が一覧表示されます。
+ `sql_hash` — SQL ステートメントの正規化されたテキストのハッシュ値である SQL ステートメントの識別子。
+ `plan_hash` — `sql_hash` と計画のハッシュを組み合わせた一意の識別子。
+ `status` - 計画のステータス。オプティマイザは、承認済みの計画を実行できます。
+ `enabled` — 計画がすぐに使用できる (true) か、使用できない (false) かを示します。
+ `plan_outline` – 実際の実行計画を再作成するために使用された計画の表現。ツリー構造内の演算子は EXPLAIN 出力の演算子にマップされます。

`apg_plan_mgmt.dba_plans` ビューには、計画が最後に使用された日時など、計画のすべての詳細を含むさらに多くの列があります。詳細については、「[Aurora PostgreSQL 互換エディションの apg\$1plan\$1mgmt.dba\$1plans ビューのリファレンス](AuroraPostgreSQL.Optimize.dba_plans_view_Reference.md)」を参照してください。

## 正規化と SQL ハッシュ
<a name="AuroraPostgreSQL.Optimize.Start.hash-and-normalization"></a>

`apg_plan_mgmt.dba_plans` ビューでは、SQL のハッシュ値により管理ステートメントを識別できます。SQL ハッシュは、リテラル値などのいくつかの違いを取り除く SQL ステートメントの正規化表現で計算されます。

各 SQL ステートメントの*正規化*プロセスでは、スペースと大文字と小文字が区別されないため、SQL ステートメントの要点を読んで理解することができます。正規化により、次の項目が削除されるか置き換えられます。
+ 先頭のブロックコメント
+ EXPLAIN キーワードと EXPLAIN オプション、EXPLAIN ANALYZE
+ 末尾のスペース
+ すべてのリテラル

例として、以下のステートメントを見てみましょう。

```
/*Leading comment*/ EXPLAIN SELECT /* Query 1 */ * FROM t WHERE x > 7 AND y = 1; 
```

クエリ計画管理は、このステートメントを次のように正規化します。

```
SELECT /* Query 1 */ * FROM t WHERE x > CONST AND y = CONST; 
```

正規化を使用することで、リテラル値またはパラメータ値のみが異なる可能性がある類似の SQL ステートメントで同じ SQL ハッシュを使用できます。つまり、同じ SQL ハッシュに対して、異なる計画が異なる条件下で最適となる、複数の計画がある可能性があります。

**注記**  
異なるスキーマで使用される単一の SQL ステートメントは、実行時に特定のスキーマにバインドされるため、計画が異なります。プランナーはスキーマバインディングの統計を使用して最適な計画を選択します。

オプティマイザが計画を選択する方法の詳細については、「[Aurora PostgreSQL 管理計画を使用する](AuroraPostgreSQL.Optimize.UsePlans.md)」を参照してください。このセクションでは、`EXPLAIN` および `EXPLAIN ANALYZE` の使用方法と、実際に使用される前に計画をプレビューする方法を学ぶことができます。詳細については、「[オプティマイザが選択した計画の分析](AuroraPostgreSQL.Optimize.UsePlans.md#AuroraPostgreSQL.Optimize.UsePlans.AnalyzePlans)」を参照してください。計画を選択するプロセスの概要を示す画像については、「[オプティマイザが実行する計画を選択する方法。](AuroraPostgreSQL.Optimize.UsePlans.md#AuroraPostgreSQL.Optimize.UsePlans.ChoosePlans)」を参照してください。