Oracle SQL Plan Management 详解
Oracle SQL Plan Management 详解
适用版本:Oracle Database 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07
1. 概述
SQL Plan Management (SPM) 稳定执行计划[1]:
详细见:Oracle SQL Plan Baseline 基线。
2. 组件
2.1 SQL Plan Baseline
- 计划基线
- 一组可接受计划
- 防止退化
2.2 SQL Management Base (SMB)
- 存储 Baseline
- SYSAUX 表空间
- 自动管理
3. 流程
3.1 捕获
- 自动捕获
- 或手动加载
- 存入 SMB
3.2 选择
- 优化器生成计划
- 与 Baseline 比较
- 优先 Baseline 计划
3.3 演化
- 新计划验证
- 性能更好则接受
- 加入 Baseline
4. 自动捕获
4.1 启用
ALTER SYSTEM SET optimizer_capture_sql_plan_baselines = TRUE;
4.2 重复 SQL
- SQL 执行 2 次
- 第二次自动捕获
- 存入 Baseline
4.3 关闭
ALTER SYSTEM SET optimizer_capture_sql_plan_baselines = FALSE;
5. 手动加载
5.1 游标缓存
DECLARE
pls PLS_INTEGER;
BEGIN
pls := DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE(
sql_id => 'abc1234567890'
);
END;
/
5.2 SQL Tuning Set
DECLARE
pls PLS_INTEGER;
BEGIN
pls := DBMS_SPM.LOAD_PLANS_FROM_SQLSET(
sqlset_name => 'my_sts',
basic_filter => 'sql_id = ''abc1234567890'''
);
END;
/
5.3 Stored Outline
DECLARE
pls PLS_INTEGER;
BEGIN
pls := DBMS_SPM.MIGRATE_STORED_OUTLINE(
attribute_name => 'all'
);
END;
/
6. 查看
6.1 视图
SELECT sql_handle, plan_name, enabled, accepted, fixed, origin
FROM dba_sql_plan_baselines;
SELECT * FROM dba_sql_management_config;
6.2 详细
SELECT sql_handle, plan_name, sql_text, origin, last_modified
FROM dba_sql_plan_baselines
WHERE sql_text LIKE '%emp%';
7. 使用
7.1 启用
ALTER SYSTEM SET optimizer_use_sql_plan_baselines = TRUE;
7.2 选择逻辑
1. 优化器生成计划
2. 与 Baseline 比较
3. 优先 Baseline accepted 计划
4. Fixed > Accepted
5. 无匹配:新计划加入 unaccepted
8. 演化
8.1 自动
-- 自动演化任务
SELECT task_name, status
FROM dba_advisor_executions
WHERE task_name = 'SYS_AUTO_SPM_EVOLVE_TASK';
8.2 手动
DECLARE
v_report CLOB;
BEGIN
v_report := DBMS_SPM.EVOLVE_SQL_PLAN_BASELINE(
sql_handle => 'SQL_xxx',
plan_name => 'SQL_PLAN_yyy'
);
END;
/
8.3 验证
- 性能更好
- 接受新计划
- 加入 Baseline
9. Fixed
9.1 固定
EXEC DBMS_SPM.ALTER_SQL_PLAN_BASELINE(
sql_handle => 'SQL_xxx',
plan_name => 'SQL_PLAN_yyy',
attribute_name => 'FIXED',
attribute_value => 'YES'
);
9.2 影响
- Fixed 计划优先
- 不演化新计划
- 稳定
10. 管理
10.1 启用/禁用
EXEC DBMS_SPM.ALTER_SQL_PLAN_BASELINE(
sql_handle => 'SQL_xxx',
attribute_name => 'ENABLED',
attribute_value => 'NO'
);
10.2 删除
EXEC DBMS_SPM.DROP_SQL_PLAN_BASELINE(
sql_handle => 'SQL_xxx',
plan_name => 'SQL_PLAN_yyy'
);
10.3 配置
EXEC DBMS_SPM.CONFIGURE(
parameter_name => 'SPACE_BUDGET_PERCENT',
parameter_value => 10
);
11. 迁移
11.1 Stored Outlines
- 老 Stored Outline
- 迁移到 Baseline
- 现代化
11.2 升级
- 升级时保留
- 测试
- 演化
12. 应用场景
12.1 计划稳定
- 防止退化
- 稳定
- 生产
12.2 升级
- 升级前捕获
- 升级后验证
- 演化
12.3 应用变更
- SQL 变更
- Baseline 保护
- 测试
13. 监控
13.1 使用
SELECT sql_handle, plan_name, enabled, accepted, fixed, executions
FROM dba_sql_plan_baselines;
13.2 性能
SELECT sql_id, plan_hash_value, elapsed_time
FROM v$sql
WHERE sql_id = '&sql_id';
14. 常见问题
14.1 不使用 Baseline
- enabled/accepted
- 检查
- force_match
14.2 新计划不接受
- 演化
- 手动接受
- 测试
14.3 空间
- SYSAUX
- 监控
- 配置
15. 最佳实践
- 捕获:生产
- 启用:使用
- 演化:定期
- Fixed:关键
- 监控:使用
- 测试:性能
- 迁移:Outline
- 升级:保护
- 文档:记录
- 演练:定期
16. 参考资料
[1] Oracle Database SQL Tuning Guide 19c, “SQL Plan Management” https://docs.oracle.com/en/database/oracle/oracle-database/19/tgsql/