

# 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)。