

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

# 使用 Aurora PostgreSQL 受管計劃
<a name="AuroraPostgreSQL.Optimize.UsePlans"></a>

若要讓最佳化工具使用針對受管陳述式而擷取的計劃，請將參數 `apg_plan_mgmt.use_plan_baselines` 設為 `true`。以下是本機執行個體範例。

```
SET apg_plan_mgmt.use_plan_baselines = true;
```

當應用程式執行時，此設定會使得最佳化工具針對每個受管陳述式，使用有效且已啟用的最低成本、優先的或已核准的計劃。

## 分析最佳化工具的所選擇計劃
<a name="AuroraPostgreSQL.Optimize.UsePlans.AnalyzePlans"></a>

當 `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
```

輸出會顯示來自基準且將執行的已核准計劃。不過，輸出也會顯示它找到更低成本的計劃。在此案例中，您啟用自動計劃擷取，如[自動擷取計劃](AuroraPostgreSQL.Optimize.CapturePlans.md#AuroraPostgreSQL.Optimize.CapturePlans.Automatic)所述，以擷取這個新的最低成本計劃。

最佳化工具一律會擷取新計劃作為 `Unapproved`。使用 `apg_plan_mgmt.evolve_plan_baselines` 函數來比較計劃，並將它們變更為已核准、已拒絕或已停用。如需詳細資訊，請參閱[評估計劃效能](AuroraPostgreSQL.Optimize.Maintenance.md#AuroraPostgreSQL.Optimize.Maintenance.EvaluatingPerformance)。

## 最佳化工具如何選擇要執行的計劃
<a name="AuroraPostgreSQL.Optimize.UsePlans.ChoosePlans"></a>

執行計劃的成本是最佳化工具為了比較不同計劃而做的預估。計算計劃的成本時，最佳化工具會納入該計劃所需的 CPU 和 I/O 作業等因素。若要了解 PostgreSQL 查詢規劃器成本預估的詳細資訊，請參閱 PostgreSQL 文件中的[查詢規劃](https://www.postgresql.org/docs/current/runtime-config-query.html)。

下圖顯示當查詢計劃管理處於或不處於作用中狀態時，如何為指定 SQL 陳述式選擇計劃。



![\[Aurora PostgreSQL 的查詢計劃管理工作流程\]](http://docs.aws.amazon.com/zh_tw/AmazonRDS/latest/AuroraUserGuide/images/aurora-query-plan-mgmt_processing-flow.png)


流程如下所示：

1. 最佳化工具會為 SQL 陳述式產生最低成本計劃。

1. 如果查詢計劃管理未處於作用中狀態，則會立即執行最佳化工具的計劃 (A. 執行最佳化工具的計劃)。當 `apg_plan_mgmt.capture_plan_baselines` 和 `apg_plan_mgmt.use_plan_baselines` 參數均為預設設定 (分別為「off」和「false」) 時，查詢計劃管理會處於非作用中狀態。

   否則，查詢計劃管理會處於作用中狀態。在此情況下，SQL 陳述式和最佳化工具的計劃會在選擇計劃之前進一步評估。
**提示**  
具有 `apg_plan_mgmt` 角色的資料庫使用者可以主動比較計劃，更改計劃的狀態，並根據需要強制使用特定計劃。如需詳細資訊，請參閱[改善 Aurora PostgreSQL 查詢計劃](AuroraPostgreSQL.Optimize.Maintenance.md)。

1. SQL 陳述式可能已經有過去由查詢計劃管理儲存的計劃。計劃以及用來建立它們之 SQL 陳述式的相關資訊依同儲存於 `apg_plan_mgmt.dba_plans`。計劃的相關資訊包括其狀態。計劃的狀態可以決定其是否已使用，如下所示。

   1. 如果計劃不在 SQL 陳述式的預存計劃中，表示該特定計畫是第一次由最佳化工具針對指定 SQL 陳述式而產生的。計劃會傳送至「擷取計劃處理」(4)。

   1. 如果計劃位於預存計劃中，且其狀態為「已核准」或「偏好」，則會執行該計劃 (A. 執行最佳化工具的計劃)。

      如果計劃位於預存計劃中，但既不是「已核准」也不是「偏好」，則計劃會傳送至「擷取計劃處理」(4)。

1. 第一次擷取指定 SQL 陳述式的計劃時，計劃的狀態一律設為「已核准 (P1)」。如果最佳化工具隨後針對相同的 SQL 陳述式產生相同的計劃，則該計劃的狀態會變更為「未核准」(P1\$1n)。

   擷取計劃並更新其狀態後，評估會繼續進行下一個步驟 (5)。

1. 計劃的*基準*由 SQL 陳述式的歷史記錄及其在各種狀態下的計劃所組成。根據「使用計劃基準」選項是否開啟，查詢計劃管理可以在選擇計劃時將基準列入考量，如下所示。
   + 當 `apg_plan_mgmt.use_plan_baselines` 參數設定為預設值 (`false`) 時，使用計劃基準為「off」。計劃在運行之前不會與基準進行比較 (A. 執行最佳化工具的計劃)。
   + 當 `apg_plan_mgmt.use_plan_baselines` 參數設定為 `true` 時，使用計劃基準為「on」。該計劃會使用基準 (6) 進一步評估。

1. 該計劃會與基準中陳述式的其他計劃進行比較。

   1. 如果最佳化工具的計劃位於基準中的計劃，則會檢查其狀態 (7a)。

   1. 如果最佳化工具的計劃不在基準的計劃中，該計劃會以新 `Unapproved` 計劃的形式新增至陳述式的計劃。

1. 系統會檢查計劃的狀態，以決定是否為「未核准」。

   1. 如果計劃的狀態為「未核准」，則計劃的預估成本會與針對未核准執行計劃臨界值指定的成本預估進行比較。
      + 如果計劃的預估成本低於臨界值，則最佳化工具會使用它，即使它是未核准的計劃 (A. 執行最佳化工具的計劃)。一般而言，最佳化工具不會執行未核准的計劃。然而，當 `apg_plan_mgmt.unapproved_plan_execution_threshold` 參數指定成本臨界值，最佳化工具會將「未核准」計劃的成本與臨界值進行比較。如果預估成本低於臨界值，最佳化工具會執行該計劃。如需詳細資訊，請參閱[apg\$1plan\$1mgmt.unapproved\$1plan\$1execution\$1threshold](AuroraPostgreSQL.Optimize.Parameters.md#AuroraPostgreSQL.Optimize.Parameters.unapproved_plan_execution_threshold)。
      + 如果計劃的預估成本不低於臨界值，則會檢查計劃的其他屬性 (8a)。

   1. 如果計劃的狀態為「未核准」以外的其他屬性，則會勾選其他屬性 (8a)。

1. 最佳化工具不會使用已停用的計劃。亦即 `enable` 屬性設定為 'f' (false) 的計劃。最佳化工具也不會使用狀態為「已拒絕」的計劃。

   最佳化工具無法使用任何無效的計劃。隨著時間的推移，當計劃所依賴的物件 (例如索引或資料表) 被移除或刪除時，計劃可能會變成無效。

   1. 如果陳述式有任何已啟用且有效的優先計劃，最佳化工具會從為此 SQL 陳述式儲存的「優先計劃」中選擇最低成本計劃。然後，最佳化工具會執行已核准的最低成本計劃。

   1. 如果陳述式沒有任何已啟用且有效的偏好計劃，則會在下一個步驟 (9) 中進行評估。

1. 如果陳述式有任何已啟用且有效的已核准計劃，最佳化工具會從為此 SQL 陳述式儲存的「已核准」計劃中選擇最低成本計劃。然後，最佳化工具會執行已核准的最低成本計劃。

   如果陳述式沒有任何有效且已啟用的已核准計劃，最佳化工具會使用最低成本計劃 (A. 執行最佳化工具的計劃)。