当然个人在使用ash的时候感觉最慢的地方就是在于输入时间戳了,每次输入侧时候都得一边看着样例,一边按照格式,一份ash的报告,至少20%以上的时间耗在这个时间戳上了。
有时候想查看几个时间点的数据,如果精确到分钟,那么运行ashrpt.sql就得一次又一次的输入时间戳,虽然报告生成的速度还是很快,但是老是感觉手工劳动的部分太多,毕竟有很多的选项我们并不需要。
所以使用了如下的脚本来定制ash,只需要通过shell脚本输入两个时间戳即可。
print "
WHENEVER SQLERROR EXIT 5
SET FEEDBACK OFF
SET HEAD OFF
SET PAGES 0
connect ${DB_CONN_STR}@${SH_DB_SID}\n
set linesize 150
select d.dbid||','||i.instance_number||',to_date('||chr(39)||$1||chr(39)||','||chr(39)||'yyyymmddHH24MISS'||chr(39)||'),to_date('||chr(39)||$2||chr(39)||','||chr(39)||'yyyymmddHH24MISS'||chr(39)||')' text
from v\$database d,
v\$instance i ;
" | sqlplus -s /nolog > ash_inputs.lst
sqlplus -s ${DB_CONN_STR}@${SH_DB_SID} set echo off verify off timing off feedback off trimspool on trimout on
set long 1000000 pagesize 6000 linesize 80
spool ashrpt_$1_$2.lst
select output from table(dbms_workload_repository.ash_report_text(`cat ash_inputs.lst`));
spool off;
EOF
比如我想查看22号7点25分到7点26分的ash数据,就直接输入下面的命令即可。
ksh genashtext.sh 20141022072500 20141022072600
OUTPUT
--------------------------------------------------------------------------------
ASH Report For TEST01/TEST01
DB Name DB Id Instance Inst Num Release RAC Host
------------ ----------- ------------ -------- ----------- --- ------------
TEST01 3645037571 TEST01 1 11.2.0.3.0 NO rac1
CPUs SGA Size Buffer Cache Shared Pool ASH Buffer Size
---- ------------------ ------------------ ------------------ ------------------
2 299M (100%) 48M (16.1%) 200M (67.0%) 4.0M (1.3%)
Analysis Begin Time: 22-Oct-14 07:25:00
Analysis End Time: 22-Oct-14 07:26:00
Elapsed Time: 1.0 (mins)
Begin Data Source: V$ACTIVE_SESSION_HISTORY
End Data Source: V$ACTIVE_SESSION_HISTORY
关于ash还是有一些额外的东西需要补充,ash和awr的部分还是有一些不同,比如ash的数据有在内存中的有在硬盘中归档了的。
在生成ash报告的时候就可以选择。
完整的方法和参数是下面的样子。
FUNCTION ash_report_text(l_dbid IN NUMBER,
l_inst_num IN NUMBER,
l_btime IN DATE,
l_etime IN DATE,
l_options IN NUMBER DEFAULT 0,
l_slot_width IN NUMBER DEFAULT 0,
l_sid IN NUMBER DEFAULT NULL,
l_sql_id IN VARCHAR2 DEFAULT NULL,
l_wait_class IN VARCHAR2 DEFAULT NULL,
l_service_hash IN NUMBER DEFAULT NULL,
l_module IN VARCHAR2 DEFAULT NULL,
l_action IN VARCHAR2 DEFAULT NULL,
l_client_id IN VARCHAR2 DEFAULT NULL,
l_plsql_entry IN VARCHAR2 DEFAULT NULL,
l_data_src IN NUMBER DEFAULT 0
)
其中l_data_src就决定了数据来源是从内存,硬盘还是两者兼有。默认是都有。
当然了还可以根据需要来绑定sql/session来更有针对性的查看信息。