

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

# Aurora PostgreSQL 查詢計劃管理的最佳實務
<a name="AuroraPostgreSQL.Optimize.BestPractice"></a>

查詢計劃管理可讓您控制查詢執行計劃如何和何時變更。作為 DBA，使用 QPM 時的主要目標包括在資料庫發生變更時防止迴歸，以及控制是否允許最佳化工具使用新計畫。下面是一些使用查詢計畫管理的建議最佳實務。主動式和被動式計畫管理方法在如何和何時核准使用新計畫上有所不同。

**Contents**
+ [主動式計劃管理有助於避免效能退化](#AuroraPostgreSQL.Optimize.BestPractice.Proactive)
  + [主要版本升級之後確保計畫穩定性](#AuroraPostgreSQL.Optimize.BestPractice.MajorVersionUpgrade)
+ [被動式計劃管理可偵測並修復效能迴歸](#AuroraPostgreSQL.Optimize.BestPractice.Reactive)

## 主動式計劃管理有助於避免效能退化
<a name="AuroraPostgreSQL.Optimize.BestPractice.Proactive"></a>

為了防止發生計畫效能迴歸，您可以執行一個程序，將新探索到之計畫的效能與已核准計畫之現有基準的效能進行比較，以*發展*計畫基準，然後自動核准最快的計畫集作為新基準。如此一來，一段時間後若探索到更快的計畫，計畫的基準也會隨之改善。

1. 在開發環境中，識別會對效能或系統傳輸量造成最大影響的 SQL 陳述式。然後，擷取這些陳述式的計劃，如[針對特定 SQL 陳述式來手動擷取計劃](AuroraPostgreSQL.Optimize.CapturePlans.md#AuroraPostgreSQL.Optimize.CapturePlans.Manual) 和[自動擷取計劃](AuroraPostgreSQL.Optimize.CapturePlans.md#AuroraPostgreSQL.Optimize.CapturePlans.Automatic)所述。

1. 從開發環境中匯出擷取的計劃，然後匯入生產環境中。如需更多詳細資訊，請參閱 [匯出和匯入 Aurora PostgreSQL 的受管計劃](AuroraPostgreSQL.Optimize.Maintenance.ExportingImporting.md)。

1. 在生產環境中，執行您的應用程式，並強制使用已核准的受管計劃。如需更多詳細資訊，請參閱 [使用 Aurora PostgreSQL 受管計劃](AuroraPostgreSQL.Optimize.UsePlans.md)。當應用程式執行時，也要新增最佳化工具所發現的新計劃。如需更多詳細資訊，請參閱 [自動擷取計劃](AuroraPostgreSQL.Optimize.CapturePlans.md#AuroraPostgreSQL.Optimize.CapturePlans.Automatic)。

1. 分析未核准的計劃，並核准其中表現良好的計劃。如需更多詳細資訊，請參閱 [評估計劃效能](AuroraPostgreSQL.Optimize.Maintenance.md#AuroraPostgreSQL.Optimize.Maintenance.EvaluatingPerformance)。

1. 當您的應用程式繼續執行時，最佳化工具會視情況開始使用新計劃。

### 主要版本升級之後確保計畫穩定性
<a name="AuroraPostgreSQL.Optimize.BestPractice.MajorVersionUpgrade"></a>

PostgreSQL 的每個主要版本都包括旨在提高效能之查詢最佳化工具的增強和變更。不過，最佳化處理程式在舊版中產生的查詢執行計畫，可能會導致較新的升級版本中的效能迴歸。您可使用查詢計畫管理器解決這些效能問題，並確保主要版本升級後的計畫穩定性。

最佳化工具一律使用成本最低的核准計畫，即使同一陳述式存在多個已核准計畫也是如此。升級之後，最佳化工具可能會發現新計畫，但會儲存為未核准的計畫。只有當使用被動式計畫管理和 unapproved\$1plan\$1execution\$1threshold 參數獲得核准時，才會執行這些計畫。您可以使用計畫管理的主動式樣式搭配 evolve\$1plan\$1baselines 參數，最大限度地提高計畫穩定性。這會將新計畫的效能與舊計畫進行比較，並核准或拒絕比下一個最佳計畫至少快 10% 的計畫。

升級後，您可使用 `evolve_plan_baselines` 函數，使用查詢參數繫結來比較升級前後的計畫效能。下列步驟假定您在生產環境中使用了核准的託管計劃，詳情請參閱 [使用 Aurora PostgreSQL 受管計劃](AuroraPostgreSQL.Optimize.UsePlans.md)。

1. 升級之前，請在執行查詢計畫管理器的情況下執行應用程式。當應用程式執行時，新增最佳化工具所發現的新計劃。如需詳細資訊，請參閱[自動擷取計劃](AuroraPostgreSQL.Optimize.CapturePlans.md#AuroraPostgreSQL.Optimize.CapturePlans.Automatic)。

1. 評估每個計畫的效能。如需詳細資訊，請參閱[評估計劃效能](AuroraPostgreSQL.Optimize.Maintenance.md#AuroraPostgreSQL.Optimize.Maintenance.EvaluatingPerformance)。

1. 升級後，請使用 `evolve_plan_baselines` 函數再次分析核准的計畫。比較使用查詢參數繫結前後的效能。若新計畫速度快，您可將其新增至已核准的計畫中。若其比相同參數繫結的另一個計畫快，則可將較慢的計畫標記為 Rejected (拒絕)。

   如需詳細資訊，請參閱[核准較佳計劃](AuroraPostgreSQL.Optimize.Maintenance.md#AuroraPostgreSQL.Optimize.Maintenance.EvaluatingPerformance.Approving)。如需此函數的參考資訊，請參閱 [apg\$1plan\$1mgmt.evolve\$1plan\$1baselines](AuroraPostgreSQL.Optimize.Functions.md#AuroraPostgreSQL.Optimize.Functions.evolve_plan_baselines)。

如需詳細資訊，請參閱 [Ensuring consistent performance after major version upgrades with Amazon Aurora PostgreSQL-Compatible Edition Query Plan Management](https://aws.amazon.com/blogs/database/ensuring-consistent-performance-after-major-version-upgrades-with-amazon-aurora-postgresql-query-plan-management/) (使用 Amazon Aurora PostgreSQL 相容版本查詢計畫管理確保主要版本升級後的效能一致)。

**注意**  
當您使用邏輯複寫或 AWS DMS執行主要版本升級時，請務必複寫 `apg_plan_mgmt` 結構描述，以確保將現有的計畫複製到已升級的執行個體。如需邏輯複寫的詳細資訊，請參閱 [使用邏輯複寫來執行 Aurora PostgreSQL 的主要版本升級](AuroraPostgreSQL.MajorVersionUpgrade.md)。

## 被動式計劃管理可偵測並修復效能迴歸
<a name="AuroraPostgreSQL.Optimize.BestPractice.Reactive"></a>

在應用程式執行時對其進行監控，您可偵測導致效能迴歸的計劃。當您偵測到迴歸時，您可以下列這些步驟手動拒絕或修正不良的計劃。

1. 當您的應用程式執行時，請強制使用受管計劃並自動將新發現的計劃新增為未核准。如需更多詳細資訊，請參閱 [使用 Aurora PostgreSQL 受管計劃](AuroraPostgreSQL.Optimize.UsePlans.md) 及 [自動擷取計劃](AuroraPostgreSQL.Optimize.CapturePlans.md#AuroraPostgreSQL.Optimize.CapturePlans.Automatic)。

1. 監控執行中的應用程式是否效能退化。

1. 當您發現計劃退化時，請將計劃的狀態設為 `rejected`。最佳化工具下一次執行 SQL 陳述式時，它會自動忽略已拒絕的計劃，並改用另一個已核准的計劃。如需更多詳細資訊，請參閱 [拒絕或停用較慢的計劃](AuroraPostgreSQL.Optimize.Maintenance.md#AuroraPostgreSQL.Optimize.Maintenance.EvaluatingPerformance.Rejecting)。

   在某些情況下，您可能選擇修正不良的計劃，而非拒絕、停用或刪除計劃。使用 `pg_hint_plan` 延伸來試驗改善計劃。在 `pg_hint_plan` 中，您使用特別註解來指示最佳化工具如何更改其平常建立計劃的方式。如需詳細資訊，請參閱[使用 pg\$1hint\$1plan 修正計劃](AuroraPostgreSQL.Optimize.Maintenance.md#AuroraPostgreSQL.Optimize.Maintenance.pg_hint_plan)。