首页 > 数据库 > Oracle > 三器合一,根治SQL痼疾,降低80%性能事故!
统计信息失真?索引失效?绑定变量窥视?
优化器的心思你猜不透
历史执行计划无处追溯
🎯 今天,解锁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%性能事故!
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69947868/viewspace-3092275/ ,如需转载,请注明出处,否则将追究法律责任。