暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SQL Tuning Advisor(STA)

酒负盛名的笔记 2018-01-27
834

  SQL 优化指导(SQL Tuning Advisor)使用自动调优优化器对SQL语句进行优化,优化器通过调整SQL语句的执行计划,使SQL语句运行达到最优化,10g版本及以上可以使用。优化的结果以参考建议的形式提供用户选择,包括:收集对象的统计信息、建立新索引、重构 SQL 语句、建立优化执行的 SQL Profile(SQL 配置文件)等。前些天对收集到的sql问题语句进行了STA优化,遇到了问题,在此记录一下。


一、先实验介绍STA一般用法

 1.创建一个测试表T1并插入10000条数据,创建索引并收集统计信息

 2.模拟执行计划出错的sql,并查看执行计划

 3.针对上述sql创建一个名为my_sql_tuning_task_1的自动调整任务并执行

 4.使用dbms_sqltune.report_tuning_task来查看自动调整任务的调整结果

 5.根据提示接受这个sql profile,并查看结果

 6.但是这里有一个坑,换一个条件却又失败了

 7.dbms_sqltune.accept_sql_profile的输入参数FORCE_MATCH的默认值为FALSE,表示在sql文本完全匹配的情况下才会应用sql profile,这种情况下只要目标sql文本发生一点变动(1变成2),原有的sql profile就失去作用。要想继续生效,则FORCE_MATCH的值改为TRUE.

execute dbms_sqltune.accept_sql_profile(task_name =>'my_sql_tuning_task_1', task_owner => 'SCOTT', replace => TRUE,force_match=>true);


二、创建调优任务的其它用法

 1.由于环境的不同,有时候上面的创建调优任务会失效,抛ORA-13780: SQL statement does not exist.


官网给出的CREATE_TUNING_TASK Functions,根据实际环境进行变换:

    2.1SQL text format:

DBMS_SQLTUNE.CREATE_TUNING_TASK(

 sql_text         IN CLOB,

 bind_list        IN sql_binds := NULL,

 user_name        IN VARCHAR2  := NULL,

 scope            IN VARCHAR2  := SCOPE_COMPREHENSIVE,

 time_limit       IN NUMBER    := TIME_LIMIT_DEFAULT,

 task_name        IN VARCHAR2  := NULL,

 description      IN VARCHAR2  := NULL)

RETURN VARCHAR2;

  2.2SQL ID format:

DBMS_SQLTUNE.CREATE_TUNING_TASK(

 sql_id           IN VARCHAR2,

 plan_hash_value  IN NUMBER    := NULL,

 scope            IN VARCHAR2  := SCOPE_COMPREHENSIVE,

 time_limit       IN NUMBER    := TIME_LIMIT_DEFAULT,

 task_name        IN VARCHAR2  := NULL,

 description      IN VARCHAR2  := NULL)

RETURN VARCHAR2;

2.3Workload Repository format:

DBMS_SQLTUNE.CREATE_TUNING_TASK(

 begin_snap       IN NUMBER,

 end_snap         IN NUMBER,

 sql_id           IN VARCHAR2,

 plan_hash_value  IN NUMBER    := NULL,

 scope            IN VARCHAR2  := SCOPE_COMPREHENSIVE,

 time_limit       IN NUMBER    := TIME_LIMIT_DEFAULT,

 task_name        IN VARCHAR2  := NULL,

 description      IN VARCHAR2  := NULL)

RETURN VARCHAR2;

2.4SQLSET format:

DBMS_SQLTUNE.CREATE_TUNING_TASK(

 sqlset_name       IN VARCHAR2,

 basic_filter      IN VARCHAR2 :=  NULL,

 object_filter     IN VARCHAR2 :=  NULL,

 rank1             IN VARCHAR2 :=  NULL,

 rank2             IN VARCHAR2 :=  NULL,

 rank3             IN VARCHAR2 :=  NULL,

 result_percentage IN NUMBER   :=  NULL,

 result_limit      IN NUMBER   :=  NULL,

 scope             IN VARCHAR2 :=  SCOPE_COMPREHENSIVE,

 time_limit        IN NUMBER   :=  TIME_LIMIT_DEFAULT,

 task_name         IN VARCHAR2 :=  NULL,

 description       IN VARCHAR2 :=  NULL

 plan_filter       IN VARCHAR2 :=  'MAX_ELAPSED_TIME',

 sqlset_owner      IN VARCHAR2 :=  NULL)

RETURN VARCHAR2;

2.5SQL Performance Analyzer format:

 DBMS_SQLTUNE.CREATE_TUNING_TASK(

  spa_task_name     IN VARCHAR2,

  spa_task_owner    IN VARCHAR2 :=  NULL,

  spa_compare_exec  IN VARCHAR2 :=  NULL,

  basic_filter      IN VARCHAR2 :=  NULL,

  time_limit        IN NUMBER   :=  TIME_LIMIT_DEFAULT,

  task_name         IN VARCHAR2 :=  NULL,

  description       IN VARCHAR2 :=  NULL)

RETURN VARCHAR2;


   总结:STA创建调优任务要根据实际环境,一般前面三种可以满足大部分情况。执行dbms_sqltune.accept_sql_profile的时候,谨记FORCE_MATCH的值改为TRUE。



文章转载自酒负盛名的笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论