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 Outline | 强 | 低 | 8i+ |
| SQL Profile | 弱 | 高 | 10g+ |
| SQL Plan Baseline | 中 | 中 | 11g+ |
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. 最佳实践
- STA:起步
- Profile:常用
- force_match:TRUE
- 监控:效果
- 评估:建议
- 文档:记录
- 迁移:导入
- Baseline:配合
- 测试:验证
- 原理:理解
16. 参考资料
[1] Christian Antognini, https://antognini.ch/fieldnotes [2] Christian Antognini, “Troubleshooting Oracle Performance”, Apress [3] Oracle Database SQL Tuning Guide 19c