当前位置: DBARoad > SQL优化 | 性能优化 > 文章正文

SQL Profiles与语句优化

                    作者 :OoNiceDream【转载时请务必以超链接形式标明文章原始出处和作者信息】
                    链接:http://www.dbaroad.me/archives/2010/03/sql_profiles.html

最近对10G的SQL Profiles做了一点学习。 个人理解SQL Profiles可以看作是SQL语句的统计信息。只是这个统计信息对特定SQL语句才能起作用,不对会语句的对象、其它语句产生影响。

使用SQL Profiles前要用SQL Tuning Advisor收集对语句的优化建议,再根据优化建议创建SQL Profiles。

SQL Profiles 使用也比较灵活,可以在会话级、系统级应用。

语句绑定SQL Profile后,测试了下SQL Profile与Bind Peeking的关系。测试发现,Bind Peeking的特性还是会起作用。这从另一方面说明SQL Profile与OUTLINE的不同:绑定OUTLINE后,执行计划是被固化的;绑定SQL Profile后,执行计划不是不变,而是优化器在执行该语句时,会参考SQL Profile中的信息。

SQL Profiles会收集哪些信息?这点比较悬,没找到特别好的解释,不过从DBA_SQLTUNE_STATISTICS视图中也可以看到蛛丝马迹:

CREATE OR REPLACE VIEW DBA_SQLTUNE_STATISTICS AS
SELECT TASK_ID, OBJECT_ID, PARSING_SCHEMA_ID, MODULE, ACTION, ELAPSED_TIME,
         CPU_TIME, BUFFER_GETS, DISK_READS, DIRECT_WRITES,
         ROWS_PROCESSED, FETCHES, EXECUTIONS,
         END_OF_FETCH_COUNT, OPTIMIZER_COST, OPTIMIZER_ENV, COMMAND_TYPE
  FROM   wri$_adv_sqlt_statistics;

以下是SQL Profiles的使用步骤,记录一下,当做速查手册:

1、创建优化任务:

–使用SQL TEXT

DECLARE
 my_task_name VARCHAR2(50);
 my_sqltext   CLOB;
BEGIN
 my_sqltext := 'select /*+ FULL(T) */ * from t where n=:A';
 my_task_name := DBMS_SQLTUNE.CREATE_TUNING_TASK(
         sql_text    => my_sqltext,
         user_name   => 'ROCKEY',
         scope       => 'COMPREHENSIVE',
         time_limit  => 60,
         task_name   => 'rockey_sql_tuning_task_001',
         description => 'Task to tune a query on a sspecified table');
END;
/

–使用SQL ID:

DECLARE
 my_task_name VARCHAR2(50);
 my_sql_id   VARCHAR2(64);
BEGIN
 my_sql_id := 'gh991ctttx3k7';
 my_task_name := DBMS_SQLTUNE.CREATE_TUNING_TASK(
         sql_id    => my_sql_id,
         scope       => 'COMPREHENSIVE',
         time_limit  => 60,
         task_name   => 'rockey_sql_tuning_task_001',
         description => 'Task to tune a query on a specified table');
END;
/

2、执行优化任务:

BEGIN
  DBMS_SQLTUNE.EXECUTE_TUNING_TASK( task_name => 'rockey_sql_tuning_task_001');
end;
/

3、查看优化建议:

SET WRAP ON
SET LONG 10000
SET LONGCHUNKSIZE 1000
SET LINESIZE 130
SELECT DBMS_SQLTUNE.REPORT_TUNING_TASK( 'rockey_sql_tuning_task_001') from DUAL;
或者
SELECT dbms_advisor.GET_TASK_REPORT(task_name)
  FROM dba_advisor_tasks
 where task_name = 'rockey_sql_tuning_task_001';

其中dbms_advisor.GET_TASK_REPORT可用于查看ADDM REPORT。

4、创建SQL Profile:

DECLARE
 my_sqlprofile_name VARCHAR2(30);
BEGIN
 my_sqlprofile_name := DBMS_SQLTUNE.ACCEPT_SQL_PROFILE (
    task_name => 'rockey_sql_tuning_task_001',
    name      => 'my_sql_profile_001',
    category    => 'my_category');
END;
/

5、SQL语句绑字SQL Profile:
修改sqltune_category参数,可以会话级、系统级进行更改:

alter session set sqltune_category=MY_CATEGORY;

6、查看语句是否使用了SQL Profile:

select sql_text, sql_id, sql_profile, executions, plan_hash_value
  from v$sql
 where sql_profile is not null;

7、其它常用功能:
删除优化任务:

begin
dbms_sqltune.drop_tuning_task('rockey_sql_tuning_task_001');
end;
/
 
begin
dbms_advisor.delete_task('rockey_sql_tuning_task_001');
end;
/

删除SQL Profile:

BEGIN
  DBMS_SQLTUNE.DROP_SQL_PROFILE(name => 'my_sql_profile_001');
END;
/

与优化任务相关的常用视图:

select * from dba_sql_profiles;
 
select * from DBA_ADVISOR_TASKS;

— The End —

喜欢DBARoad的文章,那就通过 RSS Feed 功能订阅阅读吧!

我要评论

*

* 绝不会泄露


  • 订阅


      抓虾
      google reader
      my yahoo
      bloglines
      鲜果
      有道

站内搜索



返回首页 | 关于我 | 联系我 | 广告合作 | 网站地图 | 友情链接 | 版权声明 |