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 PatchSQL ProfileSQL 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. 最佳实践

  1. 紧急修复:Patch
  2. 不能改 SQL:Patch
  3. Hint 验证:先测
  4. 文档:记录
  5. 监控:使用
  6. 测试:完整
  7. Baseline:长期
  8. Profile:自动
  9. 清理:无用
  10. 演练:定期

14. 参考资料

[1] Oracle Database SQL Tuning Guide 19c, “SQL Patch” https://docs.oracle.com/en/database/oracle/oracle-database/19/tgsql/