ITPub博客

首页 > 数据库 > Oracle > 三器合一,根治SQL痼疾,降低80%性能事故!

三器合一,根治SQL痼疾,降低80%性能事故!

原创 Oracle 作者:wddwr7307914 时间:2025-07-28 21:55:14 4 删除 编辑

统计信息失真?索引失效?绑定变量窥视?

优化器的心思你猜不透

历史执行计划无处追溯

🎯 今天,解锁Oracle性能优化的“黄金三剑客”

# 1.SQLHC

Oracle SQLHC(SQL Health Check)是Oracle官方提供的免费、无侵入式性能诊断工具,专为深度排查SQL执行环境问题而设计。其核心作用在于通过系统化检查与SQL性能相关的关键环境因素,快速定位性能瓶颈,并提供精准优化建议!

```
用于检查单个SQL语句运行的环境,检查基于成本的
优化器(CBO)统计数据、模式对象元数据、配置参数和其他可能影响正在分析的SQL的性能!

sqlplus / as sysdba
SQL> sqlhc.sql “T” djkbyr8vkc64h
```

image.png

# 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;
```

image.png

# 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;
/
```

image.png

## 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/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
中国DBA联盟(ACDU)成员,Oracle PostgreSQL ACE,CSDN博客专家及B站知名UP主,全网粉丝10万+,目前服务于工业互联网,擅长主流Oracle、MySQL、PG、高斯及Greenplum备份恢复,安装迁移,性能优化、故障应急处理。

注册时间:2020-06-13

  • 博文量
    203
  • 访问量
    212091