

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# Aurora PostgreSQL 查詢計劃管理
<a name="AuroraPostgreSQL.Optimize.Start"></a>

為 Aurora PostgreSQL 資料庫叢集開啟查詢計劃管理後，最佳化工具會針對其處理多次的任何 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 資料庫叢集列出檢視中目前計劃的詳細資訊。
+ `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)。