统计信息失真?索引失效?绑定变量窥视?
优化器的心思你猜不透
历史执行计划无处追溯
???? 今天,解锁Oracle性能优化的“黄金三剑客”
# 1.SQLHC
Oracle SQLHC(SQL Health Check)是Oracle官方提供的免费、无侵入式性能诊断工具,专为深度排查SQL执行环境问题而设计。其核心作用在于通过系统化检查与SQL性能相关的关键环境因素,快速定位性能瓶颈,并提供精准优化建议!
``` 用于检查单个SQL语句运行的环境,检查基于成本的 优化器(CBO)统计数据、模式对象元数据、配置参数和其他可能影响正在分析的SQL的性能!
sqlplus / as sysdba SQL> sqlhc.sql “T” djkbyr8vkc64h ```

# 2.SQL Tuning Advisor
Oracle SQL Tuning Advisor(STA)是Oracle数据库内置的自动化SQL性能诊断与优化引擎,其核心作用是通过智能分析SQL执行环境,提供权威、可落地的调优建议,显著提升查询效率。
## 2.1 授权
``` CONNECT / AS SYSDBA GRANT ADVISOR TO SH; GRANT SELECT_CATALOG_ROLE TO SH; GRANT EXECUTE ON DBMS_SQLTUNE TO SH ```
## 2.2 Create Task
``` SET SERVEROUTPUT ON declare stmt_task VARCHAR2(40); begin stmt_task := DBMS_SQLTUNE.CREATE_TUNING_TASK(sql_id => ‘5etrekix123’); DBMS_OUTPUT.put_line('task_id: ’ || stmt_task ); end; /
select task_name from dba_advisor_log where owner=‘SH’; ```
## 2.3 执行Task
``` Execute dbms_sqltune.Execute_tuning_task (task_name => ‘TEST_sql_tuning_task’);
select status from dba_advisor_log where task_name=‘TEST_sql_tuning_task’; ```
## 2.4 调优建议 ``` set long 65536 set longchunksize 65536 set linesize 100 select dbms_sqltune.report_tuning_task(‘TEST_sql_tuning_task’) from dual; ```

# 3. SQL Profile
SQL Profile 是⼀些信息的集合体,存储在数据字典中,使得 SQL 优化器可以为 SQL 语句产⽣最优的执⾏计划。
SQL Profile包含⾃动 SQL 调优期间发现的对产⽣错误执⾏计划的评估的纠正信息。这些信息能改善优化器的数据量(cardinality),选择率(selectivity)评估,⽽这些信息会指引优化器找到更好的执⾏计划
## 3.1 绑定执行计划 ``` 1.创建调优任务,指定需优化的SQL_ID
DECLARE l_task_name VARCHAR2(30); BEGIN l_task_name := DBMS_SQLTUNE.CREATE_TUNING_TASK( sql_id => ‘&target_sql_id’, – 替换为实际SQL_ID scope => DBMS_SQLTUNE.SCOPE_COMPREHENSIVE, time_limit => 3600, – 分析超时时间(秒) task_name => ‘sql_profile_tuning_task’ ); END; /
2.执行调优分析 EXEC DBMS_SQLTUNE.EXECUTE_TUNING_TASK(task_name => ‘sql_profile_tuning_task’);
3.获取优化建议报告 set long 10000 set longchunksize 1000 set linesize 100 set heading off SELECT DBMS_SQLTUNE.REPORT_TUNING_TASK( ‘sql_profile_tuning_task’) from DUAL; set heading on
4.接受SQL Profile ECLARE my_sqlprofile_name VARCHAR2(30); begin my_sqlprofile_name := DBMS_SQLTUNE.ACCEPT_SQL_PROFILE ( task_name => ‘sql_profile_tuning_task’, name => ‘my_sql_profile’); end; / ```

## 3.2 EMCC自动管理 SQL Profiles 可以通过 Oracle 企业管理器(Enterprise Manager)的⾃动 SQL 调优流程部分来管理它。
``` 使⽤EMCC: 1. 在 Performance ⻚⾯, 点击 Top Activity。 Top Activity ⻚⾯出现。 2. 在 Top SQL 下, 点击使⽤ SQL profile 的 SQL 语句的 SQL ID 链接。 SQL Details ⻚⾯显示出来。 3. 点击 Plan Control 栏。 SQL Profiles 和 Outlines 部分会显示 SQL Profile 的列表。 4. 选择想要管理的 SQL profile。 执⾏下⾯的任意操作 one of the following: 要启⽤⼀个当前被禁⽤的 SQL profile,点击 Disable/Enable。 要禁⽤⼀个当前被启⽤的 SQL profile,点击 Disable/Enable。 要删除⼀个 SQL profile,点击 Delete. 5. Confirmation ⻚⾯显示出来。 点击 Yes 来确认,或者 No 取消刚才的操作。 ```
# 4.正确的执行计划
## 4.1 GATHER_PLAN_STATISTICS ``` SELECT /*+ GATHER_PLAN_STATISTICS */ * FROM orders WHERE order_date > SYSDATE - 30;
查看真实执行计划 SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(NULL, NULL, ‘ALLSTATS LAST’)); ```
## 4.2 DBMS_XPLAN.DISPLAY_CURSOR ``` SELECT /*+ MONITOR */ * FROM employees WHERE department_id = 60;
SELECT sql_id, child_number, sql_text FROM v$sql WHERE sql_text LIKE ‘%SELECT /*+ MONITOR */ * FROM employees%’;
查看真实执行计划 SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(‘sql_id’, child_number, ‘ALLSTATS LAST’)); 示例: DBMS_XPLAN.DISPLAY_CURSOR(‘d1s3gf7g8sh9d’, 0, ‘ALLSTATS LAST’) ```
# 总结 SQLHC速诊 → Tuning Advisor开方 → SQL Profile固效,形成自动化调优闭环,降低80%性能事故!
