

# 删除 Aurora PostgreSQL 查询计划
<a name="AuroraPostgreSQL.Optimize.Deleting"></a>

删除未使用的执行计划或无效的计划。有关删除计划的更多信息，请参阅以下各节。

**Topics**
+ [删除计划](#AuroraPostgreSQL.Optimize.Maintenance.DeletingPlans)
+ [验证计划](#AuroraPostgreSQL.Optimize.Maintenance.ValidatingPlans)

## 删除计划
<a name="AuroraPostgreSQL.Optimize.Maintenance.DeletingPlans"></a>

如果计划已超过一个月（具体来说，为 32天）未使用，则会自动删除。这是 `apg_plan_mgmt.plan_retention_period` 参数的原定设置。您可以将计划保留期更改为较长的时间段，也可以更改为从值 1 开始的较短时间段。通过从当前日期中减去 `last_used` 日期来计算自上次使用计划以来的天数。`last_used` 日期是优化程序选择计划作为最低成本计划或运行该计划的最近日期。计划的这一日期存储在 `apg_plan_mgmt.dba_plans` 视图中。

建议您删除长时间未使用或者无用的计划。每个计划都具有 `last_used` 日期，优化程序在每次执行某个计划或选择计划作为语句的最低成本计划时，都会更新该日期。检查上次 `last_used` 日期以确定可以安全删除的计划。

以下查询返回一个具有三列的表，其中包含有关计划总数、无法删除的计划数和成功删除的计划数的计数。此查询有一个嵌套查询示例，旨在说明如何使用 `apg_plan_mgmt.delete_plan` 函数来删除过去 31 天内未选为最低成本计划且其状态不为 `Rejected` 的所有计划。

```
SELECT (SELECT COUNT(*) from apg_plan_mgmt.dba_plans) total_plans,
       COUNT(*) FILTER (WHERE result = -1) failed_to_delete,
       COUNT(*) FILTER (WHERE result = 0) successfully_deleted
       FROM (
            SELECT apg_plan_mgmt.delete_plan(sql_hash, plan_hash) as result
            FROM apg_plan_mgmt.dba_plans
            WHERE last_used < (current_date - interval '31 days')
            AND status <> 'Rejected'
            ) as dba_plans ;
```

```
 total_plans | failed_to_delete | successfully_deleted
-------------+------------------+----------------------
           3 |                0 |                    2
```

有关更多信息，请参阅 [apg\$1plan\$1mgmt.delete\$1plan](AuroraPostgreSQL.Optimize.Functions.md#AuroraPostgreSQL.Optimize.Functions.delete_plan)。

要删除无效和您认为会保持无效的计划，请使用 `apg_plan_mgmt.validate_plans` 函数。此函数可让您删除或禁用无效计划。有关更多信息，请参阅 [验证计划](#AuroraPostgreSQL.Optimize.Maintenance.ValidatingPlans)。

**重要**  
如果您未删除多余的计划，则最终可能会耗尽为查询计划管理留出的共享内存。要控制可供托管计划使用的内存量，请使用 `apg_plan_mgmt.max_plans` 参数。在自定义数据库参数组中设置此参数并重启数据库实例，让更改生效。有关更多信息，请参阅 [apg\$1plan\$1mgmt.max\$1plans](AuroraPostgreSQL.Optimize.Parameters.md#AuroraPostgreSQL.Optimize.Parameters.max_plans) 参数。

## 验证计划
<a name="AuroraPostgreSQL.Optimize.Maintenance.ValidatingPlans"></a>

使用 `apg_plan_mgmt.validate_plans` 函数来删除或禁用无效的计划。

在删除了所依赖的对象（例如索引或表）时，托管计划会成为无效或过时。但是，如果重新创建了删除的对象，计划可能仅临时无效。如果某个无效计划以后会变成有效，建议您禁用无效的计划或者不执行任何操作，而不是删除它。

要查找并删除所有无效且在过去一周中未使用的计划，请使用 `apg_plan_mgmt.validate_plans `函数，如下所示。

```
SELECT apg_plan_mgmt.validate_plans(sql_hash, plan_hash, 'delete') 
FROM apg_plan_mgmt.dba_plans
WHERE last_used < (current_date - interval '7 days');
```

要直接启用或禁用计划，请使用 `apg_plan_mgmt.set_plan_enabled` 函数。