Oracle10g中就推出了新的优化诊断工具:数据库自动诊断监视工具ADDM和SQL优化建议工具STA。这两个工具的结合使用,能使DBA节省大量优化时间,也大大减少了系统宕机的危险。简单点说,ADDM就是收集相关的统计数据到自动工作量知识库(Automatic Workload Repository AWR)中,而STA则根据这些数据,给出优化建议。

一、ADDM(Automatic Database Diagnostic Monitor)

ADDM提供了一个整体的优化方案。基于一段时间内的AWR snapshots可以执行ADDM 分析,它可以帮我们诊断在这段期间内数据库可能存在的瓶颈。

1、这个工具的使用非常简单,它是不需要安装的。但要求系统参数STATISTICS_LEVEL设置为TYPICAL(推荐)或ALL,系统默认为TYPICAL了。
SQL> ALTER SESSION SET STATISTICS_LEVEL = TYPICAL;

2、先获取到两次AWR快照的ID
SQL> select snap_id from (SELECT * FROM dba_hist_snapshot ORDER BY snap_id desc) where rownum <= 2;
    SNAP_ID
----------
       1200
       1199

3、然后创建优化任务,并执行
SQL> @?/rdbms/admin/addmrpt.sql
输入 begin_snap 的值:  1199
输入 end_snap 的值:  1200
输入 report_name 的值:  <enter使用默认文件名>
Report written to addmrpt_1_1199_1200.txt
查看addmrpt_1_1199_1200.txt文件内容即可。
此外,如果是RAC环境下,可以执行addmrpti.sql,这脚本的执行,会多出要求输入DB ID和instance ID的要求。

4、诊断结果分析

第一部分包括一些基础信息,分析时间段、DB和instance ID&名字、主机名字、Oracle版本、快照范围、数据库消耗时间、多少个活动会话。
第二部分就是ADDM发现的问题,并给出的相应建议。
第三部分是关于此次优化建议的一些附加信息。
第四部分是对诊断报告中用到的术语的解释:
DATABASE TIME:是ADDM的度量数据。从用户角度看:这是从向数据库请求开始,消耗在用户等待响应上的全部时间(不包括网络响应时间);从数据库实例角度看:前台进程消耗在等待一种数据库资源(例如,IO读)、CPU运行和等待CPU释放(队列等待)的总共时间。ADDM分析的目标就尽量降低这个数字,也就是减少实例响应时间。
AVERAGE DATABASE LOAD:所有能统计到的有多少用户(也称为“活动会话”)等待实例响应。这是实例负荷的度量指标。平均数据库负荷是由整个分析计算出来的平均负荷。通过“Database Time”除以分析周期时间得到。例如,分析周期时30分钟,而数据库运行消耗时间是90分钟,那就说明平均有3个用户在等待响应。
IMPACT:每一个找到的问题都有“影响”这一项。“影响”是数据库消耗时间用于处理这个问题的时间不分。假定我们所找到的这个问题完全解决,那么数据库消耗时间就会相应减少“影响”时间。
BENEFIT:每一个找到的问题都“受益”这一项。如果所有建议操作得到实施,ADDM分析估计数据库消耗时间能减少“受益”的全部时间。

二、STA(SQL Tuning Advisor)

ADDM得出了诊断结果,并给出了优化建议。通常90%的性能问题都是由于应用引起的,而应用问题肯定离不开问题语句。那么如何优化这些语句呢,以前靠的是DBA的经验,现在就可以使用STA了。使用STA一定要保证优化器是CBO模式下。

1、创建优化任务并执行
SQL> DECLARE
     my_task_name VARCHAR2(30);
     my_sqltext CLOB;
BEGIN
     my_sqltext := 'select a.table_name, b.object_id from bigtab b, smalltab a';
     my_task_name := DBMS_SQLTUNE.CREATE_TUNING_TASK(
           sql_text => my_sqltext,
           user_name => 'DEMO',
           scope => 'COMPREHENSIVE',
           time_limit => 60,
           task_name => 'TEST_sql_tuning_task',
           description => 'Task to tune a query on a specified PRODUCT');
     dbms_sqltune.Execute_tuning_task (task_name => 'TEST_sql_tuning_task');
END;
/
DBMS_SQLTUNE.CREATE_TUNING_TASK 就是用来创建优化任务的函数。其中,sql_text是需要优化的语句,user_name是该语句通过哪个用户执行,scope是优化范围(limited或comprehensive),time_limit优化过程的时间限制,task_name优化任务名称,description优化任务描述。dbms_sqltune.Execute_tuning_task是执行优化的函数。

2、查看优化建议结果
SQL> set long 10000
SQL> set linesize 100
SQL> SELECT DBMS_SQLTUNE.REPORT_TUNING_TASK('TEST_sql_tuning_task') FROM DUAL;
优化建议结果分为三部分:
第一部分是关于这次优化任务的基本信息:如任务名称、执行时间、范围、涉及到的语句等等。
第二部分是关于这次优化任务的所找到的问题以及给出的优化建议。前面先给出了问题描述;然后是建议的具体内容;最后是相关注意事项。
最后,报告还给出了原有的查询计划,以及采用优化建议以后的查询计划的对比。可以看出COST值大大下降。