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 自动 捕获
应用 自动 选择
防退化 部分 是

详细见: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