Oracle SQL Patch 详解
Oracle SQL Patch 详解
适用版本:Oracle Database 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07
1. 概述
SQL Patch 是轻量级 SQL 优化指令[1]:
详细见:Oracle SQL Profile 详解、Oracle SQL Plan Baseline 基线。
2. vs Profile / Baseline
| 项 | SQL Patch | SQL Profile | SQL Plan Baseline |
|---|---|---|---|
| 范围 | 单 SQL | 单 SQL | 单 SQL |
| 类型 | Hint 注入 | 统计调整 | 计划固定 |
| 修改 SQL | 否 | 否 | 否 |
| 接受 | 手动 | 手动/自动 | 演化 |
3. 创建
3.1 基本
BEGIN
SYS.DBMS_SQLDIAG.CREATE_SQL_PATCH(
sql_text => 'SELECT * FROM employees WHERE dept_id = 10',
hint_text => 'INDEX(employees idx_dept)',
name => 'patch_emp_dept'
);
END;
/
3.2 SQL_ID
BEGIN
SYS.DBMS_SQLDIAG.CREATE_SQL_PATCH(
sql_id => 'abc1234567890',
hint_text => 'INDEX(employees idx_dept)',
name => 'patch_emp_dept'
);
END;
/
3.3 多 Hint
hint_text => 'INDEX(employees idx_dept) PARALLEL(4)'
4. 查看
4.1 视图
SELECT name, sql_text, status, created
FROM dba_sql_patches;
SELECT * FROM sql_patches;
4.2 详细
SELECT name, category, sign, hint_text
FROM dba_sql_patches
WHERE name = 'patch_emp_dept';
5. 启用/禁用
5.1 启用
EXEC SYS.DBMS_SQLDIAG.ALTER_SQL_PATCH('patch_emp_dept', 'ENABLE');
5.2 禁用
EXEC SYS.DBMS_SQLDIAG.ALTER_SQL_PATCH('patch_emp_dept', 'DISABLE');
6. 删除
EXEC SYS.DBMS_SQLDIAG.DROP_SQL_PATCH('patch_emp_dept');
7. 验证
7.1 执行计划
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('&sql_id'));
-- Note: SQL patch "patch_emp_dept" used for this statement
7.2 Hint
- Note 标记
- 验证生效
8. 应用场景
8.1 紧急修复
- SQL 慢
- 不能改 SQL
- Patch 注入 Hint
8.2 应用 SQL
- 第三方应用
- 无法修改
- Patch 调整
8.3 计划稳定
- 固定计划
- 简单
- 比 Baseline 轻
9. Hint 示例
9.1 索引
hint_text => 'INDEX(t idx_name)'
9.2 JOIN
hint_text => 'USE_HASH(a b)'
9.3 并行
hint_text => 'PARALLEL(t 4)'
9.4 优化器
hint_text => 'FIRST_ROWS(100)'
10. 与 Profile 配合
10.1 区别
- Profile:自动调整
- Patch:手动 Hint
- 可同时
10.2 选择
- Profile:自动
- Patch:精确
- Baseline:稳定
11. 监控
11.1 使用
SELECT name, status, last_used
FROM dba_sql_patches;
11.2 性能
SELECT sql_id, executions, elapsed_time, plan_hash_value
FROM v$sql
WHERE sql_id = '&sql_id';
12. 常见问题
12.1 不生效
- 禁用
- SQL 文本不匹配
- force_match
12.2 错误
- 语法
- Hint 无效
- 检查
12.3 冲突
- SQL 已有 Hint
- Patch Hint
- 测试
13. 最佳实践
- 紧急修复:Patch
- 不能改 SQL:Patch
- Hint 验证:先测
- 文档:记录
- 监控:使用
- 测试:完整
- Baseline:长期
- Profile:自动
- 清理:无用
- 演练:定期
14. 参考资料
[1] Oracle Database SQL Tuning Guide 19c, “SQL Patch” https://docs.oracle.com/en/database/oracle/oracle-database/19/tgsql/