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。