Oracle SQL Profile 详解
Oracle SQL Profile 详解
适用版本:Oracle Database 10g / 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07
1. 概述
SQL Profile 是 SQL 优化辅助信息[1]:
特点:
- CBO 自动调整
- 不修改 SQL 文本
- 自动应用
- 比 Hint 更智能
2. 创建 SQL Profile
2.1 SQL Tuning Advisor
-- 创建任务
DECLARE
v_task VARCHAR2(100);
BEGIN
v_task := DBMS_SQLTUNE.CREATE_TUNING_TASK(sql_id => '&sql_id');
DBMS_SQLTUNE.EXECUTE_TUNING_TASK(v_task);
END;
/
-- 报告
SELECT DBMS_SQLTUNE.REPORT_TUNING_TASK('&task') FROM dual;
-- 接受 Profile
EXEC DBMS_SQLTUNE.ACCEPT_SQL_PROFILE(
task_name => '&task',
name => 'my_profile',
force_match => TRUE -- 相似 SQL 都应用
);
详细见:Oracle SQL 调优顾问。
2.2 手动导入
-- 从 SQL 调优集
DECLARE
v_profile VARCHAR2(100);
BEGIN
v_profile := DBMS_SQLTUNE.IMPORT_SQL_PROFILE(
sql_text => 'SELECT ...',
profile => sys.sqlprof_attr('OPT_ESTIMATE(...)', 'INDEX(...)'),
name => 'my_profile',
force_match => TRUE
);
END;
/
3. 查看
3.1 列表
SELECT
name,
category,
status,
created,
force_matching
FROM dba_sql_profiles
ORDER BY created DESC;
3.2 详情
SELECT
name,
sql_text,
type,
status
FROM dba_sql_profiles
WHERE name = 'MY_PROFILE';
3.3 属性
SELECT
attr_name,
attr_value
FROM dba_sql_profiles p, TABLE(dbms_sqltune.get_sql_profile_attr(p.name)) a
WHERE p.name = 'MY_PROFILE';
4. 管理
4.1 启用/禁用
-- 禁用
EXEC DBMS_SQLTUNE.ALTER_SQL_PROFILE('my_profile', 'STATUS', 'DISABLED');
-- 启用
EXEC DBMS_SQLTUNE.ALTER_SQL_PROFILE('my_profile', 'STATUS', 'ENABLED');
4.2 重命名
EXEC DBMS_SQLTUNE.ALTER_SQL_PROFILE('my_profile', 'NAME', 'new_name');
4.3 修改分类
EXEC DBMS_SQLTUNE.ALTER_SQL_PROFILE('my_profile', 'CATEGORY', 'my_category');
4.4 删除
EXEC DBMS_SQLTUNE.DROP_SQL_PROFILE('my_profile');
5. force_match
5.1 EXACT
-- 仅匹配完全相同 SQL 文本
SELECT * FROM emp WHERE id = 1; -- 应用
SELECT * FROM emp WHERE id = 2; -- 不应用
5.2 FORCE
-- 相似 SQL 都应用(字面量替换为绑定)
SELECT * FROM emp WHERE id = 1; -- 应用
SELECT * FROM emp WHERE id = 2; -- 应用
6. 验证
6.1 执行计划
EXPLAIN PLAN FOR SELECT ...;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY));
-- SQL plan baseline
-- SQL profile
6.2 V$SQL
SELECT sql_text, sql_profile
FROM v$sql
WHERE sql_profile IS NOT NULL;
7. 应用场景
7.1 计划不稳定
-- 数据倾斜导致计划变化
-- Profile 稳定计划
7.2 第三方 SQL
-- 不能修改 SQL 文本
-- Profile 调优
7.3 临时优化
-- 待统计信息更新
-- 临时 Profile
8. vs Hint
| 特性 | Hint | SQL Profile |
|---|---|---|
| 修改 SQL | 是 | 否 |
| 应用范围 | 单 SQL | 相似 SQL |
| 维护 | 复杂 | 简单 |
| 智能 | 静态 | 动态 |
| 优势 | 精确 | 透明 |
9. vs SQL Plan Baseline
| 特性 | SQL Profile | SQL Plan Baseline |
|---|---|---|
| 目的 | 调优信息 | 计划稳定 |
| 创建 | STA 自动 | 捕获 |
| 应用 | 自动 | 选择 |
| 防退化 | 部分 | 是 |
10. 导出/导入
10.1 STS
-- 创建 STS
EXEC DBMS_SQLTUNE.CREATE_SQLSET('profile_sts');
-- 加载
EXEC DBMS_SQLTUNE.LOAD_SQLSET('profile_sts', ...);
10.2 Data Pump
expdp ... TABLES=sys.sqlprof$ ...
11. 常见坑与排错
11.1 Profile 不生效
-- 1. 检查 STATUS
-- 2. 检查 CATEGORY
-- 3. 检查 force_match
11.2 性能变差
-- 1. 禁用 Profile
EXEC DBMS_SQLTUNE.ALTER_SQL_PROFILE('name', 'STATUS', 'DISABLED');
-- 2. 重新分析
12. 最佳实践
- STA 自动:推荐
- force_match:相似 SQL
- 监控使用:定期
- 测试验证:效果
- 结合 Baseline:稳定
- 第三方 SQL:Profile
- 统计信息更新:基础
- 谨慎手动:复杂
- 文档化:维护
- 定期复审:失效
13. 参考资料
[1] Oracle Database SQL Tuning Guide 19c, “SQL Profiles” https://docs.oracle.com/en/database/oracle/oracle-database/19/tgsql/sql-profiles.html