

# RDS for Oracle 中的实时 SQL 计划管理
<a name="Oracle.RealTimeSPM"></a>

从 Oracle Database 26ai（26.0.0.0）开始，Amazon RDS for Oracle 支持实时 SQL 计划管理。此功能通过检测执行计划更改、根据早期计划对此类更改进行评估，以及根据需要从 SQL 计划基准中选择性能最佳的计划，来防止 SQL 性能回归。此过程是透明的，不需要人工干预。

要在 RDS for Oracle 上启用实时 SQL 计划管理，您可以使用 `DBMS_SPM.CONFIGURE` 来开启自动演进任务。然后，您可以使用 `rdsadmin.rdsadmin_spm_util` 软件包来配置 SYS 拥有的任务参数。

**Topics**
+ [概述](#Oracle.RealTimeSPM.Overview)
+ [要求](#Oracle.RealTimeSPM.Requirements)
+ [启用实时 SQL 计划管理](#Oracle.RealTimeSPM.Enabling)
+ [验证配置](#Oracle.RealTimeSPM.Verifying)
+ [禁用实时 SQL 计划管理](#Oracle.RealTimeSPM.Disabling)
+ [rdsadmin\_spm\_util 过程](#Oracle.RealTimeSPM.Procedures)
+ [监控 SQL 计划基准](#Oracle.RealTimeSPM.Monitoring)
+ [注意事项](#Oracle.RealTimeSPM.Considerations)
+ [相关资源](#Oracle.RealTimeSPM.Resources)

## 概述
<a name="Oracle.RealTimeSPM.Overview"></a>

当 Oracle 优化程序选择的新执行计划比以前的计划性能更差时，就会出现 SQL 性能回归。实时 SQL 计划管理可自动检测和预防这些回归。

启用实时 SQL 计划管理后，数据库将执行以下操作：

1. 实时检测执行计划更改。

1. 对照先前的计划评估新计划的性能。

1. 自动创建或更新 SQL 计划基准。

1. 选择性能最佳的计划以防止回归。

## 要求
<a name="Oracle.RealTimeSPM.Requirements"></a>

要使用实时 SQL 计划管理，您的数据库实例必须满足以下各项要求：
+ Oracle Database 26ai 或更高版本
+ Oracle Enterprise Edition

## 启用实时 SQL 计划管理
<a name="Oracle.RealTimeSPM.Enabling"></a>

要启用实时 SQL 计划管理，请完成以下两个步骤。

### 步骤 1：开启自动 SPM 演进任务
<a name="Oracle.RealTimeSPM.Enabling.Step1"></a>

以主用户身份或具有 DBA 角色的用户身份运行以下语句：

```
BEGIN
  DBMS_SPM.CONFIGURE('AUTO_SPM_EVOLVE_TASK', 'AUTO');
END;
/
```

### 步骤 2：配置 SYS 拥有的任务参数
<a name="Oracle.RealTimeSPM.Enabling.Step2"></a>

`SYS_AUTO_SPM_EVOLVE_TASK` 任务由 SYS 拥有。RDS for Oracle 为此目的提供了 `rdsadmin.rdsadmin_spm_util` 软件包。

将 `ACCEPT_PLANS` 设置为 `TRUE`，以便数据库自动接受演进的计划：

```
EXEC rdsadmin.rdsadmin_spm_util.set_evolve_task_accept_plans('TRUE');
```

（可选）将备用计划来源设置为 `AUTO`：

```
EXEC rdsadmin.rdsadmin_spm_util.set_evolve_task_alternate_plan_source('AUTO');
```

## 验证配置
<a name="Oracle.RealTimeSPM.Verifying"></a>

要验证是否启用了实时 SQL 计划管理，请运行以下查询：

```
SELECT parameter_value
FROM DBA_SQL_MANAGEMENT_CONFIG
WHERE parameter_name = 'AUTO_SPM_EVOLVE_TASK';
```

此查询返回 `AUTO`。

要验证任务参数设置，请运行以下查询：

```
SELECT parameter_name, parameter_value
FROM DBA_ADVISOR_PARAMETERS
WHERE task_name = 'SYS_AUTO_SPM_EVOLVE_TASK'
  AND parameter_name IN ('ACCEPT_PLANS', 'ALTERNATE_PLAN_SOURCE');
```

## 禁用实时 SQL 计划管理
<a name="Oracle.RealTimeSPM.Disabling"></a>

要禁用实时 SQL 计划管理，请运行以下语句：

```
BEGIN
  DBMS_SPM.CONFIGURE('AUTO_SPM_EVOLVE_TASK', 'OFF');
END;
/
```

## rdsadmin\_spm\_util 过程
<a name="Oracle.RealTimeSPM.Procedures"></a>

`rdsadmin.rdsadmin_spm_util` 软件包提供以下过程。


**rdsadmin\_spm\_util 过程**  

| 过程 | 参数 | 默认值 | 说明 | 
| --- | --- | --- | --- | 
| `set_evolve_task_accept_plans` | `p_value` | `'TRUE'` | 为 `SYS_AUTO_SPM_EVOLVE_TASK` 设置 `ACCEPT_PLANS` 参数。有效值为 `'TRUE'` 和 `'FALSE'`。 | 
| `set_evolve_task_alternate_plan_source` | `p_value` | `'AUTO'` | 为 `SYS_AUTO_SPM_EVOLVE_TASK` 设置 `ALTERNATE_PLAN_SOURCE` 参数。有效值为 `'AUTO'`、`'CURSOR_CACHE'`、`'AUTOMATIC_WORKLOAD_REPOSITORY'` 和 `'SQL_TUNING_SET'`。 | 

## 监控 SQL 计划基准
<a name="Oracle.RealTimeSPM.Monitoring"></a>

启用实时 SQL 计划管理后，您可以监控数据库自动管理的计划基准：

```
SELECT SQL_HANDLE, PLAN_NAME, ENABLED, ACCEPTED, AUTOPURGE
FROM DBA_SQL_PLAN_BASELINES
ORDER BY LAST_MODIFIED DESC;
```

## 注意事项
<a name="Oracle.RealTimeSPM.Considerations"></a>

在使用实时 SQL 计划管理时，请考虑以下事项：
+ 具有 DBA 角色的用户可以直接调用 `DBMS_SPM.CONFIGURE`。此步骤不需要包装器。
+ `rdsadmin.rdsadmin_spm_util` 过程是在 SYS 拥有的 `SYS_AUTO_SPM_EVOLVE_TASK` 任务上配置任务参数所必需的，因为主用户无法直接访问 SYS 拥有的顾问任务。
+ 实时 SQL 计划管理以透明方式运行。您无需更改应用程序代码。
+ SQL 计划基准占用 SYSAUX 表空间中的空间。开启该功能后，监控 SYSAUX 使用情况。
+ 传递给 `DBMS_SPM.CONFIGURE` 的参数值（例如 `'AUTO'` 和 `'OFF'`）区分大小写。使用大写值。

## 相关资源
<a name="Oracle.RealTimeSPM.Resources"></a>
+ Oracle Database 文档中的 [DBMS\_SPM](https://docs.oracle.com/en/database/oracle/oracle-database/26/arpls/DBMS_SPM.html)
+ Oracle Database 文档中的 [Managing SQL plan baselines](https://docs.oracle.com/en/database/oracle/oracle-database/26/tgsql/managing-sql-plan-baselines.html)