awr報告中的sql明細部分基本必看的部分,尤其是SQL Order by Elapsed time這個部分,能夠很清晰的看到哪些sql語句占用了較多的DB
awr報告中的sql明細部分基本必看的部分,尤其是SQL Order by Elapsed time這個部分,能夠很清晰的看到哪些sql語句占用了較多的DB time,所占的比例。這個可以作為調優時的一個重要參考,可以有針對性的來看哪些sql需要格外關注。
比如說我們得到了一個awr報告,Elapsed time這個部分的內容如下。可以很明顯看出sql_id為dfb15m5s2uwmc的sql需要格外關注,因為它占用了近一半的DB time.
Elapsed Time (s)Executionsper Exec (s)%Total%CPU%IOSQL IdSQL ModuleSQL Text
3,601.90 0 48.52 99.77 0.16 dfb15m5s2uwmc JDBC Thin Client SELECT :1, machinecode, cn, co...
1,612.04 21 76.76 21.71 99.97 0.00 8tmf11fvxy09j JDBC Thin Client SELECT ROUND(AVG(SUM(END_TIME...
1,593.80 20 79.69 21.47 99.97 0.00 cy55p6nrd31db JDBC Thin Client SELECT MAX(USER_CLASS) FROM S...
298.34 20 14.92 4.02 99.96 0.00 29tdwfv5d9s4f JDBC Thin Client SELECT NVL(SUM(OTAL), ...
awr提供的功能集很完整,如果我們能夠更快的定位出來哪些sql占用了較多的DB time而不用每次都去生成一個awr報告,其實也是可以實現的,我們可以定制。
部分日志如下:
. . exported "SYS"."WRH$_SQL_PLAN" 432.1 KB 1089 rows
. . exported "SYS"."WRH$_LATCH":"WRH$_LATCH_3645037571_0" 198.6 KB 3871 rows
. . exported "SYS"."WRH$_SYSMETRIC_HISTORY" 180.1 KB 3600 rows
可以看到awr的基表是wrh$開頭的,這個和我們常用的數據字典表息息相關。
比如sqlstat,數據字典里的歷史數據就把wrh$換位dba_hist即可。
我們查看dba_hist_sqlstat的基表,其實發現就是wrh$這樣的基表。
$ ksh showdict.sh DBA_HIST_SQLSTAT
object_details
OWNER OBJECT_ID DATA_OBJECT_ID OBJECT_NAME OBJECT_TYPE
------------------------------ ---------- -------------- ------------------------------ -------------------
SYS 9409 DBA_HIST_SQLSTAT VIEW
PUBLIC 9410 DBA_HIST_SQLSTAT SYNONYM
synonym_details
OWNER SYNONYM_NAME
------------------------------ ------------------------------
PUBLIC DBA_HIST_SQLSTAT
view_details
VIEW_NAME TEXT
------------------------------ --------------------------------------------------------------------------------
DBA_HIST_SQLSTAT select sql.snap_id, sql.dbid, sql.instance_number,
xxxx from WRM$_SNAPSHOT sn, WRH$_SQLSTAT sql
where sn.snap_id = sql.snap_id
and sn.dbid = sql.dbid
and sn.instance_number = sql.instance_number
and sn.status = 0
那么我們就可以直接從這些數據字典歷史表里去查看所需要的信息而不用每次都重新生成一個awr報告。
當然實現的過程也略微費了一些周折,把腳本稍一加工,就成了shell版本。
sqlplus -s $DB_CONN_STR@$SH_DB_SID <
set pages 50
set linesize 100
col elapsed_time format a10
col per_total format a10
prompt
prompt Current Instance
prompt ~~~~~~~~~~~~~~~~
select d.dbid dbid
, d.name db_name
, i.instance_number inst_num
, i.instance_name inst_name
from v\$database d,
v\$instance i;
select snap_id,sql_id,EXECUTIONS_DELTA,max_elapsed elapsed_time,per_total||'%' per_total from
(select distinct snap_id,sql_id,EXECUTIONS_DELTA,trunc(max(ELAPSED_TIME_DELTA) OVER (PARTITION BY snap_id,sql_id )/1000000,0)||'s' max_elapsed,
trunc((max(ELAPSED_TIME_DELTA) OVER (PARTITION BY snap_id,sql_id))/(SUM(ELAPSED_TIME_DELTA) OVER (PARTITION BY snap_id )),2)*100 per_total
from dba_hist_sqlstat where snap_id=$1
order by 5 desc
) where rownum<=5;
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com