1.1.1.1 sql优化顾问
通过dbms_sqltune包可以访问SQL优化顾问的核心界面。此外,在企业管理器中还集成了一个图形界面。通过这两个界面可以执行优化任务(tuning task),还可以查看产生的建议并接受建议。
注意 要使用SQL优化顾问和dbms_sqltune包,必须获得使用Diagnostics Pack和Tuning Pack的许可。记住,这些选件仅在企业版可用。
要启动优化任务,必须调用dbms_sqltune包中的create_tuning_task函数,并将以下各项之一作为一个参数传递(函数会重载四次以接受不同类型的参数)。
Ø SQL语句的文本。
Ø 对存储在库缓存中的SQL语句的引用(sql_id)。
Ø 对存储在AWR(Automatic Workload
Repository,自动工作负载存储库)中的SQL语句的引用(sql_id)。
Ø SQL优化集的名称。
SQL优化集(SQL TUNING SETS)
简单地说,SQL优化集是将一组SQL语句与其关联的执行环境、执行统计信息和可选执行计划 存储到一起的对象。SQL优化集是使用dbms_sqltune包来管理的。
需要Tuning Pack或Real Application Testing才能使用SQL优化集,也就是说要使用企业版。
可以在Oracle
Database Performance Tuning Guide手册(11.2及之后版本)或者Oracle Database SQL Tuning Guide手册(12.1及之后版本)中找到关于SQL优化集的更多信息。
为了通过将单个SQL语句当作一个参数来简化dbms_sqltune包中的create_tuning_task函数的执行,我编写了tune_last_statement.sql脚本。其想法是你执行希望已在SQL*Plus中分析过的SQL语句,然后不使用参数来调用该脚本。该脚本会从v$session视图中获取当前会话执行的最后一条SQL语句的引用(sql_id),然后创建并执行一个引用该脚本的优化任务。该脚本的核心部分为以下匿名PL/SQL块:
DECLARE
l_sql_id v$session.prev_sql_id%TYPE;
BEGIN
SELECT prev_sql_id INTO l_sql_id
FROM v$session
WHERE audsid = sys_context('userenv','sessionid');
:tuning_task := dbms_sqltune.create_tuning_task(sql_id => l_sql_id);
dbms_sqltune.execute_tuning_task(:tuning_task);
END;
/
优化任务会将多个数据字典视图中的分析输出具体化。可以使用dbms_sqltune包中的report_tuning_task函数来生成关于分析的详细报告,而不用直接查询视图。下面的查询展示了它的使用。请注意需要使用上一个PL/SQL块返回的优化任务名称来引用优化任务:
SELECT
dbms_sqltune.report_tuning_task(:tuning_task) FROM dual;
上个查询会生成类似以下的报告来建议使用SQL配置文件。请注意这部分选自profile_opt_estimate.sql脚本生成的输出。第一部分显示分析和SQL语句的基本信息。第二部分显示结果和建议。本例中,建议使用SQL配置文件。最后一部分显示应用建议之前和之后的执行计划:
P348
要使用SQL优化顾问推荐的SQL配置文件,你需要应用它。下一部分会介绍如何应用。无论是否应用SQL配置文件,一旦不再需要优化任务,就可以调用dbms_sqltune包中的drop_tuning_task过程来删掉它:
dbms_sqltune.drop_tuning_task('TASK_3401');
1.1.1.2 接受SQL配置文件
dbms_sqltune包中的accept_sql_profile过程用来接受SQL优化顾问建议的SQL配置文件。它接受以下参数。
Ø Task_name和task_owner参数引用建议SQL配置文件的优化任务。
Ø Name和description参数指定SQL配置文件的名称和描述。例如,使用生成它的脚本名作为它的名称。
Ø Category参数用于将几个SQL配置文件组合起来,以便于管理。默认值为DEFAULT。
Ø Replace参数指定是否替换已经可用的SQL配置文件。默认值为FALSE。
Ø Force_match参数指定如何执行文本标准化。默认值是FALSE。下一部分会给出更多关于文本标准化的信息。
只有task_name是强制性参数。例如,要应用上面报告中推荐的SQL配置文件,你需要使用以下PL/SQL调用
BEGIN
dbms_sqltune.accept_sql_profile(
task_name => 'TASK_3401',
task_owner => user,
name => 'opt_estimate',
description => null,
category => 'TEST',
force_match => TRUE,
replace => TRUE
);
END;
/
一旦应用,sql配置文件就会保存在数据字典中。dba_sql_profiles视图显示了它的信息。此外,从12.1版本之后,cdb_sql_profiles视图也可用。由于sql配置文件不会被绑定到特定用户,因此all_sql_profiles和user_sql_profiles视图不存在:
select category,sql_text,force_matching
from dba_sql_profiles where name='opt_estimate';
accept_sql_profile函数与accept_sql_profile过程一样。唯一不同的是函数会返回SQL配置文件名。如果没有在输入函数中指定名称而系统需要生成结果时,这会变得很有用。
1.1.1.3 修改SQL配置文件
创建SQL配置文件之后,可以使用dbms_sqltune包中的alter_sql_profile过程来修改它的一些属性,并且还可以使用它来修改SQL配置文件的状态(enabled或disabled)。该过程接受以下参数。
Ø Name参数指定要修改的SQL配置文件。
Ø Attribute_name参数指定要修改的属性。它能接受的值有:name、description、category和status。
Ø Value参数指定新的属性值。
这三个参数是强制的。例如,以下PL/SQL调用会禁用上面例子创建的SQL配置文件:
dbms_sqltune.alter_sql_profile(
name =>'optestimate',
attribute_name =>'status',
value =>'disabled');