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

特性HintSQL Profile
修改 SQL
应用范围单 SQL相似 SQL
维护复杂简单
智能静态动态
优势精确透明

9. vs SQL Plan Baseline

特性SQL ProfileSQL Plan Baseline
目的调优信息计划稳定
创建STA 自动捕获
应用自动选择
防退化部分

详细见:Oracle SQL Plan Baseline


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

  1. STA 自动:推荐
  2. force_match:相似 SQL
  3. 监控使用:定期
  4. 测试验证:效果
  5. 结合 Baseline:稳定
  6. 第三方 SQL:Profile
  7. 统计信息更新:基础
  8. 谨慎手动:复杂
  9. 文档化:维护
  10. 定期复审:失效

13. 参考资料

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