

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 查询计划管理
<a name="query-plan-management"></a>

更改统计数据、约束、环境设置、查询参数绑定以及升级 PostgreSQL 数据库引擎都可能导致查询计划回归。*查询计划回归*（当优化程序选择的计划更不理想时，就会出现查询计划回归）之前选择的计划更不理想时，就会出现查询计划回归。

在 Amazon Aurora PostgreS [QL 兼容版本中，查询计划管理 (QPM)](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraPostgreSQL.Optimize.overview.html) 功能旨在确保计划的适应性和稳定性，无论数据库环境发生什么变化都可能导致查询计划回归。QPM 为优化器提供了一些控制。使用 QPM，您可以管理优化器为 SQL 查询生成的查询执行计划。查询执行计划强制优化器从您批准的关键查询计划中进行选择，以优化其性能。

企业通常在全球部署应用程序和数据库，或者为每个应用程序数据库维护多个环境，例如开发、QA、暂存、预生产、测试和生产。维护每个数据库、每个环境中的查询执行计划AWS 区域可能既复杂又耗时。QPM 可以将兼容 Amazon Aurora PostgreSQL 的托管计划从一个数据库导出和导入到另一个数据库。这可以帮助您集中管理查询执行计划并在全球范围内部署数据库。您可以使用此功能调查预生产数据库中的一组计划，验证它们是否运行良好，然后将它们加载到生产环境中。

QPM 还提供其他一些好处。例如，您可以使用 QPM 来改进无法在应用程序中更改或无法在语句中添加提示时的执行计划。QPM 还会自动检测优化器发现的新的最低成本计划，因此除了性能外，您还可以继续优化成本。

建议您启用 QPM。启用 QPM 后，优化器将使用您批准的最低成本计划。这有助于防止回归并减少管理和修复次优计划所需的时间。

使用 QPM 功能有两种不同的方法：主动和被动。主动方法旨在帮助防止性能回归的发生，而反应性方法旨在在性能回归发生后检测和修复。您可以根据每个查询选择方法。对于可能容易出现回归的复杂查询或关键业务查询，您可以使用主动方法为这些查询批准最佳计划。如果其他查询在运行时遇到查询计划回归，则可以使用响应式方法。检测到回归时，将该计划的状态更改为，`rejected`以便优化程序选择其他已批准的计划。有关更多信息，请参阅 [Aurora PostgreSQL 查询计划管理的最佳实践](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraPostgreSQL.Optimize.BestPractice.html)（Aurora 文档）。

## 查询计划管理是如何运作的？
<a name="qpm-operation"></a>

计划被分配以下状态之一：`approved`、`unapproved``preferred`、或`rejected`。优化器将每个托管语句的第一个生成的计划设置为，`approved`然后将其他计划的状态设置为`unapproved`。稍后，您可以评估`unapproved`计划并将其状态更改为`approved``preferred`、或`rejected`。有关更多信息，请参阅[了解 Aurora PostgreSQL 查询计划管理](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraPostgreSQL.Optimize.Start.html)（Aurora 文档）。

托管计划可以手动或自动获取。最常见的方法是自动捕获运行两次或更多次的所有语句的计划。但是，您也可以手动获取一组特定报表的计划。有关更多信息，请参阅[捕获 Aurora PostgreSQL 执行计划](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraPostgreSQL.Optimize.CapturePlans.html)（Aurora 文档）。

设置托管计划后，优化程序为各个托管语句使用有效且启用的最低成本`preferred`或`approved`计划。有关详细信息，请参阅[优化程序如何选择要运行的计划](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraPostgreSQL.Optimize.UsePlans.html#AuroraPostgreSQL.Optimize.UsePlans.ChoosePlans)（Aurora 文档）文档）。

有关在兼容 Aurora PostgreSQL 的Amazon Aurora 中配置 QPM 功能的说明，请参阅[管理 Aurora PostgreSQL 的查询执行计划](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraPostgreSQL.Optimize.html)（Aurora 文档）。

## 限制
<a name="qpm-limitations"></a>

要使用 QPM，必须确保满足支持的 SQL 语句的要求，您的语句不引用系统关系，并且您的数据库实例类有足够的 vCPUs。有关更多信息，请参阅[支持的 SQL 语句](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraPostgreSQL.Optimize.overview.html#AuroraPostgreSQL.Optimize.overview.features)和[查询计划管理限制](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraPostgreSQL.Optimize.overview.html#AuroraPostgreSQL.Optimize.overview.limitations)（Aurora 文档）。

## 查询计划管理的使用案例
<a name="qpm-use-cases"></a>
+ **防止查询计划回归** — 保持数据库版本处于最新状态可以带来许多好处，例如提高性能和安全性、访问新功能、修复已知问题以及符合监管要求。但是，数据库更新有可能导致某些查询出现性能下降。在主要版本升级中，这种风险更高，因为它们可能包含与现有应用程序查询不向后兼容的更改。在系统变更期间，实施 QPM 可以帮助防止回归并稳定性能。如果您刷新统计数据、添加索引、更改参数或升级到与 Amazon Aurora PostgreSQL 兼容的新版本，QPM 会检测到新计划，但会继续使用已批准的计划，从而保持计划的稳定性。
+ **测试功能**-您可以查看所有托管 SQL 语句的计划历史记录，并评估新的 PostgreSQL 功能或计划更改是否在提高性能。然后，您可以决定是实现这些功能还是实施新计划。有关更多信息，请参阅在 [dba\_plans 视图中检查 Aurora PostgreSQL 查询计划](https://docs.amazonaws.cn/en_us/AmazonRDS/latest/AuroraUserGuide/AuroraPostgreSQL.Optimize.ViewPlans.html)。
+ **改进计划**-在某些情况下，您可能会偏好修复次理想时，而不是拒绝、禁用或删除该计划。有关更多信息，请参阅[使用 pg\_hint\_plan 修复计划](https://docs.amazonaws.cn/en_us/AmazonRDS/latest/AuroraUserGuide/AuroraPostgreSQL.Optimize.Maintenance.html#AuroraPostgreSQL.Optimize.Maintenance.pg_hint_plan)（Aurora 文档）。