统计信息失真?索引失效?绑定变量窥视?
优化器的心思你猜不透
历史执行计划无处追溯
🎯 今天,解锁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%性能事故!