Oracle Antognini SQL Profile 详解

Oracle Antognini SQL Profile 详解

来源:Christian Antognini / antognini.ch/fieldnotes 适用版本:Oracle Database 10g+ 文档版本:v1.0 / 2026-07-22


1. 关于 Christian Antognini

Christian Antognini,Oracle ACE Director,瑞士性能专家[1]。

  • 著有《Troubleshooting Oracle Performance》
  • 博客:antognini.ch/fieldnotes
  • 擅长执行计划稳定性

2. SQL Profile 概念

2.1 作用

- 辅助 CBO
- 提供额外信息
- 不强制执行计划

2.2 与 Outline/Baseline 对比

对象强制灵活版本
Stored Outline8i+
SQL Profile10g+
SQL Plan Baseline11g+

2.3 Antognini 观点

- Profile 灵活
- 辅助 CBO
- 不僵化

3. 创建 SQL Profile

3.1 自动调优

-- 1. 创建调优任务
DECLARE
  v_task VARCHAR2(30);
BEGIN
  v_task := DBMS_SQLTUNE.CREATE_TUNING_TASK(
    sql_id => '&sql_id',
    task_name => 'tune_&sql_id');
END;
/

-- 2. 执行
EXEC DBMS_SQLTUNE.EXECUTE_TUNING_TASK('tune_&sql_id');

-- 3. 查看报告
SELECT DBMS_SQLTUNE.REPORT_TUNING_TASK('tune_&sql_id') FROM dual;

-- 4. 接受
DECLARE
  v_sql_id VARCHAR2(13) := '&sql_id';
BEGIN
  DBMS_SQLTUNE.ACCEPT_SQL_PROFILE(
    task_name => 'tune_' || v_sql_id,
    name => 'profile_' || v_sql_id,
    force_match => TRUE);
END;
/

3.2 手动

DECLARE
  v_profile_name VARCHAR2(30);
BEGIN
  v_profile_name := DBMS_SQLTUNE.IMPORT_SQL_PROFILE(
    sql_text => 'SELECT * FROM emp WHERE deptno=10',
    profile => sys.sqlprof_attr(
      'INDEX(emp idx_emp_deptno)'),
    name => 'profile_manual',
    force_match => TRUE);
END;
/

3.3 Antognini 建议

- 自动优先
- 手动补 HINT
- 评估

4. 查看

4.1 列表

SELECT name, type, status, force_matching, created 
FROM dba_sql_profiles 
ORDER BY created DESC;

4.2 详情

SELECT * FROM dba_sql_profiles WHERE name='&profile_name';

4.3 属性

SELECT attr1, attr2, attr3 
FROM sys.sqlprof$attr 
WHERE signature = (SELECT signature FROM dba_sql_profiles WHERE name='&profile_name');

5. 管理

5.1 启用/禁用

-- 禁用
EXEC DBMS_SQLTUNE.ALTER_SQL_PROFILE('profile_abc', 'STATUS', 'DISABLED');

-- 启用
EXEC DBMS_SQLTUNE.ALTER_SQL_PROFILE('profile_abc', 'STATUS', 'ENABLED');

5.2 重命名

EXEC DBMS_SQLTUNE.ALTER_SQL_PROFILE('profile_abc', 'NAME', 'profile_new');

5.3 删除

EXEC DBMS_SQLTUNE.DROP_SQL_PROFILE('profile_abc');

5.4 force_matching

- TRUE:相似 SQL 匹配
- FALSE:精确 SQL
- 推荐 TRUE

6. FORCE_MATCH

6.1 作用

- 字面量 SQL 匹配
- 等同绑定变量
- 优化

6.2 示例

- SQL: SELECT * FROM emp WHERE id=1
- SQL: SELECT * FROM emp WHERE id=2
- force_match=TRUE → 都使用同一 Profile

6.3 Antognini 强调

- 字面量 SQL 场景
- force_match=TRUE
- 等同绑定变量

7. Profile vs Baseline

7.1 Profile

- 辅助信息
- CBO 决策
- 灵活

7.2 Baseline

- 强制执行计划
- 防止回归
- 稳定

7.3 Antognini 对比

- Profile:辅助
- Baseline:强制
- 选择

8. STA(SQL Tuning Advisor)

8.1 流程

1. 创建任务
2. 执行
3. 查看建议
4. 接受 Profile

8.2 建议

- 统计信息
- SQL Profile
- 索引
- SQL 重写

8.3 Antognini 观点

- STA 起步
- 评估建议
- Profile 常用

9. 案例

9.1 案例:执行计划差

1. SQL 调优任务
2. 接受 Profile
3. 验证

9.2 案例:字面量 SQL

- 应用不改代码
- force_match=TRUE
- Profile

9.3 案例:统计信息不准

- STA 建议统计
- 收集
- 或 Profile

10. 监控

10.1 使用情况

SELECT name, status, executions 
FROM dba_sql_profiles;

10.2 效果

SELECT sql_id, plan_hash_value, elapsed_time 
FROM dba_hist_sqlstat 
WHERE sql_id='&sql_id'
ORDER BY snap_id;

10.3 Antognini 建议

- 监控效果
- 评估
- 调整

11. 迁移

11.1 导出

SELECT * FROM dba_sql_profiles;

11.2 导入

-- 手动重建
DBMS_SQLTUNE.IMPORT_SQL_PROFILE

11.3 Antognini 建议

- 跨环境迁移
- 文档
- 验证

12. SQL Patch vs Profile

12.1 SQL Patch

- 注入 HINT
- 11g+
- 临时

12.2 Profile

- 辅助信息
- CBO 决策
- 灵活

12.3 Antognini 对比

- Patch:HINT
- Profile:辅助
- 评估

13. Antognini 方法论

13.1 步骤

1. 识别问题 SQL
2. STA 调优
3. 评估建议
4. Profile
5. 验证

13.2 原则

- 自动优先
- 评估
- 灵活

13.3 工具

- DBMS_SQLTUNE
- DBMS_XPLAN
- AWR

14. 常见问题

14.1 Profile 不生效

- status
- force_match
- 检查

14.2 Profile 过时

- 统计信息变化
- 重新调优
- 评估

14.3 性能回归

- Profile 影响
- 禁用
- 评估

15. 最佳实践

  1. STA:起步
  2. Profile:常用
  3. force_match:TRUE
  4. 监控:效果
  5. 评估:建议
  6. 文档:记录
  7. 迁移:导入
  8. Baseline:配合
  9. 测试:验证
  10. 原理:理解

16. 参考资料

[1] Christian Antognini, https://antognini.ch/fieldnotes [2] Christian Antognini, “Troubleshooting Oracle Performance”, Apress [3] Oracle Database SQL Tuning Guide 19c