SQL调优化问需要一个或多个SQL语句作为输入,并调用自动优化器执行SQL调优。SQL调优顾问输出是以一种意见或者建议的形式,以及对每一项建议和期望效益的理由。该建议涉及对象的统计收集,新索引的创建,SQL语句的重组,或SQL概要的创建。你可以选择该建议来完成SQL语句的调优。
Oracle数据库可以自动优化有问题的SQL语句,并使用SQL优化顾问实现调优建议。也可以手动运行SQL优化顾问选择单个SQL语句或者一个SQL语句集来完成SQL语句调优。
一般使用的比较多的是手动SQL优化顾问,因此也重点介绍手动SQL优化顾问。
1.自动SQL优化顾问
1.1启用自动SQL优化
begin
dbms_auto_task_admin.enable(client_name => 'sql tuning advisor',
operation => null,
window_name => null);
end;
1.2失效自动SQL优化
begin
dbms_auto_task_admin.disable(client_name => 'sql tuning advisor',
operation => null,
window_name => null);
end;
1.3查看自动SQL优化报表
create table a (a1 clob);
declare
my_rept clob;
begin
my_rept := dbms_sqltune.report_auto_tuning_task(begin_exec => null,
end_exec => null,
type => 'TEXT',
level => 'TYPICAL',
section => 'ALL',
object_id => null,
result_limit => null);
insert into a values (my_rept);
end;
select * from a;
截取报告片段:
FINDINGS SECTION (3 findings)
-------------------------------------------------------------------------------
1- Statistics Finding
---------------------
表 "SYS"."OBJAUTH$" 及其索引的优化程序统计信息已失效。
Recommendation
--------------
- 考虑收集此表的优化程序统计信息。
execute dbms_stats.gather_table_stats(ownname => 'SYS', tabname =>
'OBJAUTH$', estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,
method_opt => 'FOR ALL COLUMNS SIZE AUTO');
Rationale
---------
为了选择好的执行计划, 优化程序需要此表的最新统计信息。
2.手动SQL优化顾问
SQL优化顾问可以按照需求手动调用一个或者多个SQL语句。要调用多条SQL语句,需要创建一个SQL优化集(STS)。SQL调优集是一个存储SQL语句以及执行上下文的数据库对象。
使用DBMS_SQLTUNE包运行SQL优化顾问,需要一下几个步骤:
创建SQL优化集(如果优化多个SQL语句)创建SQL优化任务执行优化SQL优化任务显示SQL优化任务结果实现适当的建议一个SQL优化任务可以为单个SQL语句创建。对于多个SQL语句,需要先创建SQL优化集(STS)。具体步骤如下:

为了找出有问题的SQL语句,需要创建创建一张没有任何所有的表。如下:
create table my_objects as select * from dba_objects;
查询EMP对象的SQL语句
select * from my_objects o where o.object_name='EMP';
my_objects表上没有任何创建索引,因此该查询语句肯定是有问题的,接下来使用SQL优化顾问来优化该SQL语句:
2.1.创建SQL优化任务
declare
v_my_task_name varchar2(50);
v_my_sql_text clob;
begin
v_my_sql_text := 'select * from my_objects o where o.object_name=:bin';
v_my_task_name := dbms_sqltune.create_tuning_task(sql_text => v_my_sql_text,
bind_list => sql_binds(anydata.convertvarchar2('EMP')),
user_name => 'GDSHEC',
scope => 'COMPREHENSIVE',
time_limit => 60,
task_name => 'my_sql_tuning_task',
description => 'Task to tune a query on a specified ');
end;
2.2.配置SQL优化任务
begin
dbms_sqltune.set_tuning_task_parameter(task_name => 'my_sql_tuning_task',
parameter => 'TIME_LIMIT',
value => 300);
end;
2.3.执行SQL优化任务
begin
dbms_sqltune.execute_tuning_task(task_name => 'my_sql_tuning_task');
end;
2.4.检查SQL优化任务状态
select * from dba_advisor_tasks t where t.task_name = 'my_sql_tuning_task';
2.5.显示SQL优化任务结果
select dbms_sqltune.report_tuning_task(task_name => 'my_sql_tuning_task')
from dual;
优化结果报告:
GENERAL INFORMATION SECTION
-------------------------------------------------------------------------------
Tuning Task Name : my_sql_tuning_task
Tuning Task Owner : GDSHEC
Workload Type : Single SQL Statement
Scope : COMPREHENSIVE
Time Limit(seconds): 300
Completion Status : COMPLETED
Started at : 12/05/2013 16:10:32
Completed at : 12/05/2013 16:10:34
-------------------------------------------------------------------------------
Schema Name: GDSHEC
SQL ID : 14suc19101mgf
SQL Text : select * from my_objects o where o.object_name=:bin
---------------------