原 Oracle性能调整的三把利剑--ASH,AWR,ADDM
简介
ASH(Active Session History,活动会话历史信息)、AWR(Automatic Workload Repository,自动负载信息库)、ADDM(Automatic Database Diagnostic Monitor,数据库自动诊断监视工具)是Oracle性能调整的三把利剑,需要深入地了解,但是面试一般都问得比较简单,主要问到的是AWR。
Oracle性能调整最重要的就是对最影响性能的SQL的调整。在一个应用中,能够影响到数据库的只有SQL,也只能是SQL。系统不能一味地依靠增强硬件、修改系统、数据库参数来提高数据库的性能,更多的应该关注那些最影响性能的SQL语句。ASH报告、AWR报告和ADDM报告都是能够找出影响性能SQL的工具。在分析ASH报告、AWR报告和ADDM报告的时候,最重要的工作就是找出对性能影响最大的SQL语句,并对其进行优化。
ASH介绍
简介
ASH(Active Session History,活动会话历史信息)每秒从V$SESSION中取ACTIVE状态会话的信息,存储在V$ACTIVE_SESSION_HISTORY
中,并收集所有活动会话的等待信息,不活动的会话不会采样。这里的活动会话包含2类情况,一类是非空闲等待事件(WAIT_CLASS <> 'Idle'),一类是“ON CPU”状态的会话。采样工作由新引入的后台进程MMNL(Manageability Monitor Lite Process)来完成。若ASH数据被刷新到磁盘,则需要从DBA_HIST_ACTIVE_SESS_HISTORY
视图中查询相关信息。
是否启用ASH功能,受一个隐含参数“_ASH_ENABLE
”的控制,默认为TRUE。而采样时间同样由另一个隐含参数“_ASH_SAMPLING_INTERVAL
”决定,默认为1000毫秒,即1秒。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | SYS@lhrdb> set pagesize 9999 SYS@lhrdb> set line 9999 SYS@lhrdb> col NAME format a40 SYS@lhrdb> col KSPPDESC format a50 SYS@lhrdb> col KSPPSTVL format a20 SYS@lhrdb> SELECT a.INDX, 2 a.KSPPINM NAME, 3 a.KSPPDESC, 4 b.KSPPSTVL 5 FROM x$ksppi a, 6 x$ksppcv b 7 WHERE a.INDX = b.INDX 8 and lower(a.KSPPINM) like lower('%¶meter%'); Enter value for parameter: _ash_enable old 8: and lower(a.KSPPINM) like lower('%¶meter%') new 8: and lower(a.KSPPINM) like lower('%_ash_enable%') INDX NAME KSPPDESC KSPPSTVL ---------- ---------------------------------------- -------------------------------------------------- -------------------- 2840 _ash_enable To enable or disable Active Session sampling and f TRUE lushing SYS@lhrdb> / Enter value for parameter: _ash_sampling_interval old 8: and lower(a.KSPPINM) like lower('%¶meter%') new 8: and lower(a.KSPPINM) like lower('%_ash_sampling_interval%') INDX NAME KSPPDESC KSPPSTVL ---------- ---------------------------------------- -------------------------------------------------- -------------------- 2838 _ash_sampling_interval Time interval between two successive Active Sessio 1000 n samples in millisecs |
1000毫秒,正好是1秒的时间。
众所周知,动态性能视图实质是Oracle自行构造的一堆存在于SGA内存区的虚表,也就是说,ASH的数据是保存在内存里的,实际上,Oracle分配给ASH的空间并不是无限大,ASH buffers的最小值为1MB,最大值不超过30MB。ASH占用的SGA内存大小可以通过如下SQL查询:
1 2 3 4 | SYS@lhrdb> SELECT * FROM V$SGASTAT WHERE NAME LIKE '%ASH buffers%'; POOL NAME BYTES ------------ ---------------------------------------- ---------- shared pool ASH buffers 16777216 |
可以看到这里分配了大约16M大小的内存。
直白地讲,V$ACTIVE_SESSION_HISTORY中能够记录多少会话信息,一方面取决于该数据库的SGA分配给ASH buffers的大小,另一方面取决于数据库的启动和关闭(重启数据库时将重构SGA内存区)。这两方面的因素制约了V$ACTIVE_SESSION_HISTORY中能够保存的会话信息的能力。作为一名DBA,肯定是希望ASH尽可能多地保留关于会话的信息,但目前来看,单纯依靠V$ACTIVE_SESSION_HISTORY肯定无法实现这个目标,有什么更好的方法呢?Oracle又提供了AWR特性,ASH收集到的会话信息,是作为AWR中快照信息的一部分,被保存到了硬盘上。
ASH内存记录数据始终是有限的,为了保存历史数据,引入了自动负载信息库(Automatic Workload Repository ,AWR) 由后台进程MMON完成。ASH信息同样被采集写出到AWR负载库中。由于内存不是足够的,所以MMNL进程在ASH写满后会将信息写出到AWR负载库中。ASH全部写出是不可接受的,所以一般只写入收集的10%的数据量,而且使用direct-path insert完成,尽量减少日志的生成,从而最小化数据库性能影响。
写出到AWR负载库的ASH信息记录在AWR的基础表wrh$active_session_hist中,wrh$active_session_hist是一个分区表,Oracle会自动进行数据清理。
如何获取ASH报告?
获取ASH报告可以有3种方式:(1)脚本生成,(2)OEM生成,(3)存储过程生成。
(1)ASH报告生成脚本如下所示,根据提示输入相应的值即可获得ASH报告。
1 2 | Linux:@?/rdbms/admin/ashrpt.sql Windows:@?\rdbms\admin\ashrpt.sql |
(2)使用OEM,可以在性能页,单击“运行ASH报告”按钮生成ASH报告,由于OEM生产用的相对比较少,这里就不讨论了。
(3)可以利用存储过程DBMS_WORKLOAD_REPOSITORY.ASH_REPORT_HTML()来获取ASH报告的文本内容,然后将文本内容拷贝到文本文件中,最后修改文本文件的后缀名为html即可打开html格式的ASH报告。例如取3116-3117之间的快照:
1 2 3 4 5 6 7 8 9 10 | -- 可以获取指定时间区间的ASH报告,例如10分钟的ASH报告 SELECT * FROM TABLE(DBMS_WORKLOAD_REPOSITORY.ASH_REPORT_HTML(2814923791,1, to_date('2024-03-10 09:00:52','YYYY-MM-DD HH24:MI:SS') , to_date('2024-03-10 09:10:52','YYYY-MM-DD HH24:MI:SS') )); SELECT * FROM TABLE(DBMS_WORKLOAD_REPOSITORY.ASH_REPORT_HTML(3424884828,1, (SELECT A.END_INTERVAL_TIME FROM DBA_HIST_ASH_SNAPSHOT A WHERE A.SNAP_ID =3116) , (SELECT A.END_INTERVAL_TIME FROM DBA_HIST_ASH_SNAPSHOT A WHERE A.SNAP_ID =3117) )); |
可以利用如下的脚本来批量生成要运行的存储过程:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | SELECT D.SNAP_ID, D.DBID, D.INSTANCE_NUMBER, (SELECT (NB.SNAP_INTERVAL) FROM DBA_HIST_WR_CONTROL NB where nb.dbid=d.dbid) SNAP_INTERVAL, (SELECT (NB.RETENTION) FROM DBA_HIST_WR_CONTROL NB where nb.dbid=d.dbid) RETENTION, TO_CHAR(D.STARTUP_TIME, 'YYYY-MM-DD HH24:MI:SS.FF') STARTUP_TIME, TO_CHAR(D.BEGIN_INTERVAL_TIME, 'YYYY-MM-DD HH24:MI:SS.FF') BEGIN_INTERVAL_TIME, TO_CHAR(D.END_INTERVAL_TIME, 'YYYY-MM-DD HH24:MI:SS.FF') END_INTERVAL_TIME, (D.FLUSH_ELAPSED) FLUSH_ELAPSED, D.SNAP_LEVEL, D.ERROR_COUNT, D.SNAP_FLAG, 'SELECT * FROM TABLE(DBMS_WORKLOAD_REPOSITORY.ASH_REPORT_HTML(' || D.DBID || ',' || D.INSTANCE_NUMBER || ', (SELECT A.END_INTERVAL_TIME FROM DBA_HIST_ASH_SNAPSHOT A WHERE A.SNAP_ID =' || (D.SNAP_ID - 1) || ') , (SELECT A.END_INTERVAL_TIME FROM DBA_HIST_ASH_SNAPSHOT A WHERE A.SNAP_ID =' || (D.SNAP_ID) || ')));' ASH_REPORT FROM DBA_HIST_ASH_SNAPSHOT D ORDER BY D.SNAP_ID DESC; |
AWR介绍
简介
AWR(Automatic Workload Repository)自动工作负载信息库AWR(Automatic Workload Repository,自动负载信息库)是Oracle 10g引入的一个重要组件。在AWR里面存储着近一段时间内(Oracle 10g默认是7天,Oracle 11g及其之后的版本默认是8天)数据库活动状态的详细信息。
AWR报告是对AWR视图进行查询而得到的一份自动生成的报告,它用于显示两个快照或者两个时间点之间捕捉到的数据。AWR报告其实就是一张数据库健康体检表,它显示了数据库健康的各项指标。通过AWR报告,DBA可以容易地获知数据库最近的活动状态,数据库的各种性能指标的变化趋势曲线,数据库最近可能存在的异常,分析数据库可能存在的性能瓶颈,从而对数据库进行优化。AWR使用几个表来存储采集的统计数据,所有的表都存储在新的名称为SYSAUX的特定表空间中的SYS模式下,并且以WRM$_*
和WRH$_*
的格式命名。前一种类型存储元数据信息(如检查的数据库和采集的快照),后一种类型保存实际采集的统计数据。H代表“历史数据(Historical)”,M代表“元数据(Metadata)”。在这些表上构建了几种带前缀DBA_HIST_*
的视图,这些视图可以用来编写自己的性能诊断工具。视图的名称直接与表相关;例如,视图DBA_HIST_SYSMETRIC_SUMMARY是在WRH$_SYSMETRIC_SUMMARY
表上构建的。AWR报告所有的数据来源于AWR视图,即以DBA_HIST_开头的所有系统表。
AWR的前身是Statspack,Statspack在Oracle 10g和Oracle 11g中也有提供,同时和AWR一起做了同步更新,而且Statspack是公开源代码的,因此,关于Statspack的资料和源代码,都是理解AWR的一个有用的辅助工具。
AWR主要是由MMON(Manageability Monitor Process,可管理性监视器进程)和它的slave进程(Mnnn)来维护的。MMON执行很多关于AWR的任务,和各种与可管理性相关的后台任务,具体包括以下功能:
(1)启动slave进程Mnnn去做AWR快照。
(2)当某个测量值(metrics)超过了其度量阀值(threshold value)时发出alert告警。
(3)为最近改变过的SQL对象捕获指标信息。
若系统不能自动生成AWR快照,则可以从以下几个方面去检查:
① 参数STATISTICS_LEVEL的值必须设置为TYPICAL或者ALL。
② 在“SELECT SNAP_INTERVAL FROM DBA_HIST_WR_CONTROL;”的查询结果中,SNAP_INTERVAL的值不能无穷大,一般为1小时,可以通过执行如下的SQL语句来修改自动生成AWR快照的时间间隔:EXEC DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(INTERVAL => 60);
。
③ 在SQL语句“SELECT D.INSTANCE_NUMBER, (SYSDATE - D.END_INTERVAL_TIME) INTERVAL FROM DBA_HIST_SNAPSHOT D WHERE D.SNAP_ID = (SELECT MAX(SNAP_ID) FROM DBA_HIST_SNAPSHOT);”的查询结果中,INTERVAL列的值需大于0,若小于0,则可以手动生成几次快照来解决这个问题,SQL语句为:EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT();。需要注意的是,在RAC环境下该命令会对数据库的所有节点都生成一次快照。
④ 检查MMON进程是否HANG住,若MMON进程HANG住,则AWR不可用。
真题1、You have set Tablespace Full Metrics Threshold values for the USERS tablespace as follows:
Warning (%):90
Critical (%):95
Which background process is responsible for issuing alerts when the threshold is crossed?
A、System monitor (SMON)
B、Process monitor (PMON)
C、Memory manager process (MMAN)
D、Manageability Monitor process (MMON)
答案:D。
题目说为USERS表空间设置了阀值,问的是当到达阀值之后哪个后台进程会发出alert告警。
本题中,对于选项A,SMON的作用是检查数据库的一致性如有必要还会在数据库打开时启动数据库的恢复。所以,选项A错误。
对于选项B,PMON的作用是负责在一个Oracle进程失败时清理资源。所以,选项B错误。
对于选项C,MMAN的作用是协调内存各组成部分的大小。所以,选项C错误。
对于选项D,MMON的作用有:(1)启动slave进程Mnnn去做AWR快照;(2)当某个测量值(metrics)超过了其度量阀值(threshold value)时发出alert告警;(3)为最近改变过的SQL对象捕获指标信息。所以,选项D正确。
所以,本题的答案为D。
如何获取AWR报告?
Oracle可以生成两种类型的AWR报告:文本格式和html格式。其中,html格式的报告界面更加友好。有针对整个数据库的AWR报告,有针对某个实例的AWR报告(在集群环境),也有针对单条SQL语句的AWR报告。可以通过运行Oracle自带的SQL脚本产生AWR报告,只是产生不同的AWR报告,需要运行不同的脚本。
1 2 3 4 5 6 7 8 9 10 11 | -- 产生整个数据库的AWR报告,运行脚本awrrpt.sql: @$ORACLE_HOME/rdbms/admin/awrrpt.sql -- 产生某个实例的AWR报告,运行脚本awrrpti.sql: @$ORACLE_HOME/rdbms/admin/awrrpti.sql -- 产生针对不同时段性能的一个比对报告,运行脚本awrddrpt.sql: @$ORACLE_HOME/rdbms/admin/awrddrpt.sql -- 产生某条SQL语句的AWR报告,运行脚本awrsqrpt.sql: @$ORACLE_HOME/rdbms/admin/awrsqrpt.sql |
另外,在这里介绍一种作者常用的生成AWR报告的方法:
首先查询数据库所有的快照:
1 2 3 4 5 6 7 8 9 10 | SELECT S.SNAP_ID, TO_CHAR(S.BEGIN_INTERVAL_TIME, 'YYYY-MM-DD HH24:MI:SS') BEGIN_INTERVAL_TIME, TO_CHAR(S.END_INTERVAL_TIME, 'YYYY-MM-DD HH24:MI:SS') END_INTERVAL_TIME, S.DBID, S.INSTANCE_NUMBER FROM DBA_HIST_SNAPSHOT S WHERE S.INSTANCE_NUMBER=1 ORDER BY S.SNAP_ID DESC; select * from table(dbms_workload_repository.awr_report_html(534927627,1,267,268)); |
例如,如果要生成203和204之间的快照,那么可以执行SELECT * FROM TABLE(DBMS_WORKLOAD_REPOSITORY.AWR_REPORT_HTML(3196811885,1,203,204));
将结果拷贝到文本文件里边,然后另存为html文件,这样就可以生成html报告了。
定时生成AWR报告
有的系统需要定时生成html格式的AWR报告,这个需求可以使用SHELL脚本来完成。
下面给出相应的SHELL脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 | [oracle@rhel6lhr awr]$ ll total 68 -rwxr-xr-x. 1 oracle oinstall 3112 Oct 23 2014 autogetawr.sh drwxr-xr-x. 2 oracle oinstall 49152 May 23 11:05 log -rw-r--r--. 1 oracle oinstall 276 Oct 22 2014 oracle_env.conf -rw-r--r--. 1 oracle oinstall 235 Oct 22 2014 readme.txt -rwxr-xr-x. 1 oracle oinstall 303 Oct 23 2014 rungetawr.sh [oracle@rhel6lhr ~]$ crontab -l 5 * * * * /home/oracle/lhr/awr/rungetawr.sh [oracle@rhel6lhr ~]$ more /home/oracle/lhr/awr/rungetawr.sh #!/bin/bash # define end snapshot time NH=`date +%Y%m%d%H` # define begin snapshot time LH=`date -d "last-hour" +%Y%m%d%H` # define the report format HTML or TEXT FH=HTML #get the awr #echo autogetawr.sh -f $LH -t $NH p $FH . $HOME/lhr/awr/oracle_env.conf $SCRIPT_DIR/autogetawr.sh -f $LH -t $NH -p $FH [oracle@rhel6lhr ~]$ more $HOME/lhr/awr/oracle_env.conf export ORACLE_BASE=/u01/app/oracle export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1 export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib export PATH=$ORACLE_HOME/bin:$PATH export ORACLE_USER=lhr/lhr@orclasm export SCRIPT_DIR=$HOME/lhr/awr export LOG_DIR=$SCRIPT_DIR/log [oracle@rhel6lhr ~]$ more /home/oracle/lhr/awr/autogetawr.sh # !/bin/bash # get the env about oracle # must define SID and ORACLE_HOME in profile #. ~oracle/.bash_profile . $HOME/lhr/awr/oracle_env.conf # # * dba_oracle_awr.sh # # Usage: dba_oracle_awr.sh # -f [from time] # -t [to time] # -p [report type, html or text] # # time format: 'yyyymmddhh24'. # E.g 2011030417 means 05pm, Mar 04, 2011 #** # get parameters #** while getopts ":f:t:p" opt do case $opt in f) from=$OPTARG ;; t) to=$OPTARG ;; p) type=$OPTARG type=$(echo $type|tr "[:upper:]" "[:lower:]") ;; '?') echo "$0: invalid option ?$OPTARG">&2 exit 1 ;; esac done if [ "$from" = "" ] then echo "from time (?f} needed" echo "program exiting..." exit 1 fi if [ "$to" = "" ] then echo "to time (?t) needed" echo "program exiting..." exit 1 fi if [ "$type" = "" ] then type="html" fi # # trim function # function trim() { local result result=`echo $1|sed 's/^ *//g' | sed 's/ *$//g'` echo $result } #*** # get begin and end snapshot ID # *** define_dur() { begin_id=`sqlplus -s $ORACLE_USER <<EOF set pages 0 set head off set feed off select max(SNAP_ID) from DBA_HIST_SNAPSHOT where END_INTERVAL_TIME<=to_date($from,'yyyymmddhh24'); EOF` ret_code=$? if [ "$ret_code" != "0" ] then echo "sqlplus failed with code $ret_code" echo "program exiting..." exit 10 fi end_id=`sqlplus -s $ORACLE_USER <<EOF set pages 0 set head off set feed off select min(SNAP_ID) from DBA_HIST_SNAPSHOT where END_INTERVAL_TIME>=to_date($to,'yyyymmddhh24'); spool off EOF` ret_code=$? if [ "$ret_code" != "0" ] then echo "sqlplus failed with code $ret_code" echo "program exiting..." exit 10 fi begin_id=$(trim ${begin_id}) end_id=$(trim ${end_id}) #echo "begin_id: $begin_id end_id: $end_id" } #*** # generate AWR report # *** generate_awr() { tmp1_id=${begin_id} while [[ ${tmp1_id} -lt ${end_id} ]] do let tmp2_id=${tmp1_id}+1 if [ $type = "text" ] then report_name=$LOG_DIR/"awrrpt_$from}_${to}.txt" else report_name=$LOG_DIR/"awrrpt_${from}_${to}.html" fi #echo $report_name sqlplus -s $ORACLE_USER >/dev/null<<EOF set term off define report_type=$type define num_days=1 define begin_snap=${tmp1_id} define end_snap=${tmp2_id} define report_name=${report_name} @?/rdbms/admin/awrrpt.sql exit; EOF tmp1_id=${tmp2_id} done } #*** # main routing # *** define_dur generate_awr [oracle@rhel6lhr ~]$ |
ADDM介绍
介绍
ADDM (Automatic Database Diagnostic Monitor AWR)ADDM(Automatic Database Diagnostic Monitor,数据库自动诊断监视工具)是植入Oracle数据库的一个自我诊断引擎。ADDM通过检查和分析AWR获取的数据来判断Oracle数据库中可能的问题。例如,系统资源紧张,出现了明显的性能问题,根据以往的办法,收集一份AWR报告,发现“db file scattered read”事件在top 5 events里面。根据经验,这个事件一般可能是因为缺少索引、统计分析信息不够新、热表都放在一个数据文件上导致I/O争用等引起的。根据这些经验,需要逐个定位排除,例如查看语句的执行计划、查看USER_TABLES的LAST_ANALYSED字段、检查热块等等步骤来最后定位出原因,并给出优化建议,但是现在可以根据ADDM采集到的数据直接给出优化建议,甚至给出优化后的语句。
与其它指导不同,ADDM在记录每个AWR快照之后会自动运行。每次记录快照后,ADDM会分析与后两个快照对应的时段。ADDM会预先监视实例,以便在大多数瓶颈问题成为严重问题之前检测到这些问题。多数情况下,ADDM会为检测到的问题提供建议解决方案,甚至可以量化这些建议的优势。
ADDM能发现定位的问题包括以下内容:
操作系统内存诊断
由于Oracle负载和非Oracle负载导致的CPU瓶颈问题
导致不同资源负载的Top SQL语句和对象——CPU消耗、I/O带宽占用、潜在I/O问题、RAC内部通讯繁忙
按照PL/SQL和Java执行时间找出Top SQL语句
过多的连接(LOGIN/LOGOFF)
过多硬解析问题——由于Shared Pool过小、书写问题、绑定大小不适应、解析失败原因引起的
过多软解析问题
索引查询过多导致资源争用
由于用户锁导致的过多的等待时间(通过包DBMS_LOCK加的锁)
由于DML锁导致的过多的等待时间
由于管道输出导致的过多等待时间(例如通过包DBMS_PIPE.PUT进行管道输出)
由于并发更新同一个记录导致的过多等待时间(行级锁等待)
由于ITL不够导致的过多等待时间(大量的事务操作同一个数据块)
系统中过多的COMMIT和ROLLBACK(logfile sync事件)
由于磁盘带宽太小和其它潜在问题(例如由于LOGFILE太小导致过多的CHECKPOINT,MTTR设置问题,过多的Undo操作等等)导致的I/O性能问题
对于DBWn进程写数据块,磁盘I/O吞吐量不足
由于归档进程无法跟上Redo日志产生的速度,导致系统变慢
Redo数据文件太小导致的问题
由于扩展磁盘分配导致的争用
由于移动一个对象的高水位导致的争用问题
内存太小问题——SGA_TARGET、PGA、Buffer Cache、Shared Pool
在一个实例或者一个集群环境中存在频繁读写争用的热块或热对象
RAC环境中内部通讯问题
LMS进程无法跟上导致锁请求阻塞
在RAC环境中由于阻塞和争用导致的实例倾斜
RMAN导致的I/O和CPU问题
STREAMS和AQ问题
资源管理等待事件
总之,ADDM提供了一个整体的优化方案,基于一段时间内的AWR快照(默认一小时一次)可以执行ADDM分析,它可以帮助诊断在这段期间内数据库可能存在的瓶颈。
如何获取ADDM报告?
有两种办法可以获取ADDM报告:
(1) 采用addmrpt.sql脚本。运行脚本:@?/rdbms/admin/addmrpt.sql
(2) 采用DBMS_ADVISOR包:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | DECLARE TASK_NAME VARCHAR2(50) := 'HEALTH_CHECK_BY_LHR'; TASK_DESC VARCHAR2(50) := 'HEALTH_CHECK_BY_LHR'; TASK_ID NUMBER; BEGIN DBMS_ADVISOR.CREATE_TASK('ADDM', TASK_ID, TASK_NAME, TASK_DESC, NULL); DBMS_ADVISOR.SET_TASK_PARAMETER(TASK_NAME, 'START_SNAPSHOT', &_SNAP_ID); DBMS_ADVISOR.SET_TASK_PARAMETER(TASK_NAME, 'END_SNAPSHOT', &_SNAP_ID1); DBMS_ADVISOR.SET_TASK_PARAMETER(TASK_NAME, 'INSTANCE', &_INSTANCE_NUMBER); DBMS_ADVISOR.SET_TASK_PARAMETER(TASK_NAME, 'DB_ID', &_DBID); DBMS_ADVISOR.EXECUTE_TASK(TASK_NAME); END; / SELECT DBMS_ADVISOR.GET_TASK_REPORT('HEALTH_CHECK_BY_LHR', 'TEXT', 'ALL') ADDM_RESULTS FROM DUAL; SELECT * FROM DBA_ADDM_TASKS T ORDER BY T.TASK_ID; SELECT * FROM DBA_ADVISOR_TASKS T ORDER BY T.TASK_ID; SELECT DBMS_ADVISOR.GET_TASK_REPORT('HEALTH_CHECK_BY_LHR', 'TEXT', 'ALL') ADDM_RESULTS FROM DUAL; |