

# 捕获 Aurora PostgreSQL 执行计划
<a name="AuroraPostgreSQL.Optimize.CapturePlans"></a>

Aurora PostgreSQL 查询计划管理提供两种不同的模式来捕获查询执行计划：即自动或手动。您可以通过将 `apg_plan_mgmt.capture_plans_baselines` 的值设置为 `automatic` 或 `manual` 来选择模式。您可以使用手动计划捕获为特定的 SQL 语句捕获执行计划。或者，您可以使用自动计划捕获来捕获应用程序运行时多次执行的所有（或者速度最慢）计划。

捕获计划时，优化程序将托管语句首次捕获的计划的状态设置为 `approved`。优化程序将为托管语句捕获的任何其他计划的状态设置为 `unapproved`。但是，有时可能有多个计划保存为 `approved` 状态。在为一个语句并行创建了多个计划并在提交语句的第一个计划之前，可能发生这种情况。

要控制可以捕获并存储在 `dba_plans` 视图中的最大计划数量，请在数据库实例级参数组中设置 `apg_plan_mgmt.max_plans` 参数。修改 `apg_plan_mgmt.max_plans` 参数后需要重启数据库实例，才能让新值生效。有关更多信息，请参阅 [apg\$1plan\$1mgmt.max\$1plans](AuroraPostgreSQL.Optimize.Parameters.md#AuroraPostgreSQL.Optimize.Parameters.max_plans) 参数。

## 手动捕获特定 SQL 语句的计划
<a name="AuroraPostgreSQL.Optimize.CapturePlans.Manual"></a>

如果您已知要管理的 SQL 语句集，请将语句放入 SQL 脚本文件，然后手动捕获计划。下面显示了如何为 SQL 语句集手动捕获查询计划的 psql 示例。

```
psql> SET apg_plan_mgmt.capture_plan_baselines = manual;
psql> \i my-statements.sql 
psql> SET apg_plan_mgmt.capture_plan_baselines = off;
```

在捕获各个 SQL 语句的计划之后，优化程序添加新行到 `apg_plan_mgmt.dba_plans` 视图。

我们建议您在 SQL 脚本文件中使用 EXPLAIN 或 EXPLAIN EXECUTE 语句。请确保在参数值中加入足够的变体以捕获所有感兴趣的计划。

如果您知道比优化程序最低成本计划更好的计划，则可以强制优化程序使用更好的计划。要这样做，请指定一个或多个优化程序提示。有关更多信息，请参阅“[使用 pg\$1hint\$1plan 修复计划](AuroraPostgreSQL.Optimize.Maintenance.md#AuroraPostgreSQL.Optimize.Maintenance.pg_hint_plan)”。要比较 `unapproved` 和 `approved` 计划的性能并批准、拒绝或删除它们，请参阅[评估计划性能](AuroraPostgreSQL.Optimize.Maintenance.md#AuroraPostgreSQL.Optimize.Maintenance.EvaluatingPerformance)。

## 自动捕获计划
<a name="AuroraPostgreSQL.Optimize.CapturePlans.Automatic"></a>

对于类似以下的情况，请使用自动计划捕获：
+ 您不知道要管理的具体 SQL 语句。
+ 您有数百乃至数千个 SQL 语句需要管理。
+ 您的应用程序使用客户端 API。例如，JDBC 使用未命名的预编译语句或者批量模式语句，无法在 psql 中表达。

**自动捕获计划**

1. 通过在数据库实例级参数组中将 `apg_plan_mgmt.capture_plan_baselines` 设置为 `automatic` 来启用自动计划捕获。有关更多信息，请参阅 [在 Amazon Aurora 中修改数据库参数组中的参数](USER_WorkingWithParamGroups.Modifying.md)。

1. 随着应用程序运行，优化程序捕获各个至少运行两次的 SQL 语句的计划。

   随着应用程序使用默认查询计划管理参数设置运行，优化程序捕获各个至少运行两次的 SQL 语句的计划。在使用默认值的同时捕获所有计划具有非常小的运行时开销，并且可在生产中启用。

**禁用自动计划捕获**
+ 从数据库实例级参数组，将 `apg_plan_mgmt.capture_plan_baselines` 参数设置为 `off`。

要评估未批准计划的性能并批准、拒绝或删除这些计划，请参阅[评估计划性能](AuroraPostgreSQL.Optimize.Maintenance.md#AuroraPostgreSQL.Optimize.Maintenance.EvaluatingPerformance)。