源码:Oracle AWR报告之Top 10 Foreground Events by Total Wait Time
生成的Load Profile效果如图,下面的源代码是我写的,不是Oracle的源码:
SET VERIFY OFFDEFINE beg_snap = 1120;
DEFINE end_snap = 1121;COLUMN short_name FORMAT a30 HEADING 'Load Profile';
COLUMN per_sec FORMAT 999,999,999.99 HEADING 'Per Second';
COLUMN per_tx FORMAT 999,999,999.99 HEADING 'Per Transaction';SET PAGESIZE 200;WITH db_info AS (SELECT(SELECT dbid FROM v$database) AS db_id,(SELECT instance_number FROM v$instance) AS instance_numberFROM dual
),
st_list_mod AS (SELECT 'DB time' stat_name, 'DB Time(s):' short_name, 1 st_order FROM dualUNION ALLSELECT 'DB CPU' stat_name, 'DB CPU(s):' short_name, 2 st_order FROM dualUNION ALLSELECT 'background cpu time' stat_name, 'Background CPU(s):' short_name, 3 st_order FROM dual
),
st_list_sys AS (SELECT 'redo size' stat_name, 'Redo size (bytes):' short_name, 4 st_order FROM dualUNION ALLSELECT 'session logical reads' stat_name, 'Logical reads (blocks):' short_name, 5 st_order FROM dualUNION ALLSELECT 'db block changes' stat_name, 'Block changes:' short_name, 6 st_order FROM dualUNION ALLSELECT 'physical reads' stat_name, 'Physical reads: (blocks)' short_name, 7 st_order FROM dualUNION ALLSELECT 'physical writes' stat_name, 'Physical writes: (blocks)' short_name, 8 st_order FROM dualUNION ALLSELECT 'physical read IO requests' stat_name, 'Read IO requests:' short_name, 9 st_order FROM dualUNION ALLSELECT 'physical write IO requests' stat_name, 'Write IO requests:' short_name, 10 st_order FROM dualUNION ALLSELECT 'physical read bytes' stat_name, 'Read IO (MB):' short_name, 11 st_order FROM dualUNION ALLSELECT 'physical write bytes' stat_name, 'Write IO (MB):' short_name, 12 st_order FROM dualUNION ALLSELECT 'IM scan rows' stat_name, 'IM scan rows:' short_name, 13 st_order FROM dualUNION ALLSELECT 'session logical reads - IM' stat_name, 'Session Logical Reads IM:' short_name, 14 st_order FROM dualUNION ALLSELECT 'user calls' stat_name, 'User calls:' short_name, 15 st_order FROM dualUNION ALLSELECT 'parse count (total)' stat_name, 'Parses:' short_name, 16 st_order FROM dualUNION ALLSELECT 'parse count (hard)' stat_name, 'Hard Parses:' short_name, 17 st_order FROM dualUNION ALLSELECT 'logons cumulative' stat_name, 'Logons:' short_name, 19 st_order FROM dualUNION ALLSELECT 'user logons cumulative' stat_name, 'User Logons:' short_name, 20 st_order FROM dualUNION ALLSELECT 'execute count' stat_name, 'Executes:' short_name, 21 st_order FROM dualUNION ALLSELECT 'user rollbacks' stat_name, 'Rollbacks:' short_name, 22 st_order FROM dual
),
elp_time AS (SELECTEXTRACT(DAY FROM e.end_interval_time - b.end_interval_time) * 86400+ EXTRACT(HOUR FROM e.end_interval_time - b.end_interval_time) * 3600+ EXTRACT(MINUTE FROM e.end_interval_time - b.end_interval_time) * 60+ EXTRACT(SECOND FROM e.end_interval_time - b.end_interval_time) AS d_elp_timeFROM dba_hist_snapshot b, dba_hist_snapshot e, db_info snWHERE e.snap_id = &end_snapAND b.snap_id = &beg_snapAND b.dbid = sn.db_idAND b.instance_number = sn.instance_numberAND e.dbid = sn.db_idAND e.instance_number = sn.instance_number
),
e_trx_val AS (SELECT SUM(VALUE) AS end_valFROM dba_hist_sysstat e, db_info snWHERE e.snap_id = &end_snapAND e.dbid = sn.db_idAND e.instance_number = sn.instance_numberAND e.stat_name IN ('user rollbacks', 'user commits')
),
b_trx_val AS (SELECT SUM(VALUE) AS bgn_valFROM dba_hist_sysstat b, db_info snWHERE b.snap_id = &beg_snapAND b.dbid = sn.db_idAND b.instance_number = sn.instance_numberAND b.stat_name IN ('user rollbacks', 'user commits')
),
trx_val AS (SELECT end_val - bgn_val AS usr_valFROM e_trx_val, b_trx_val
),
beg_value_mod AS (SELECT /*+ use_hash(s) */b.short_name, a.stat_name, a.VALUE, b.st_orderFROM dba_hist_sys_time_model a, st_list_mod b, db_info snWHERE a.stat_name = b.stat_nameAND a.snap_id = &beg_snapAND a.dbid = sn.db_idAND a.instance_number = sn.instance_number
),
beg_value_sys AS (SELECT /*+ use_hash(s) */b.short_name, a.stat_name, a.VALUE, b.st_orderFROM dba_hist_sysstat a, st_list_sys b, db_info snWHERE a.stat_name = b.stat_nameAND a.snap_id = &beg_snapAND a.dbid = sn.db_idAND a.instance_number = sn.instance_number
),
beg_workarea AS (SELECT 'SQL Work Area (MB):' short_name, 'SQL Work Area (MB):' stat_name, BYTES_PROCESSED VALUE, 18 st_orderFROM wrh$_pga_target_advice a, db_info snWHERE a.PGA_TARGET_FACTOR = 1AND a.snap_id = &beg_snapAND a.dbid = sn.db_idAND a.instance_number = sn.instance_number
),
end_workarea AS (SELECT 'SQL Work Area (MB):' short_name, 'SQL Work Area (MB):' stat_name, BYTES_PROCESSED VALUE, 18 st_orderFROM wrh$_pga_target_advice a, db_info snWHERE a.PGA_TARGET_FACTOR = 1AND a.snap_id = &end_snapAND a.dbid = sn.db_idAND a.instance_number = sn.instance_number
),
end_value_mod AS (SELECT /*+ use_hash(s) */b.short_name, a.stat_name, a.VALUE, b.st_orderFROM dba_hist_sys_time_model a, st_list_mod b, db_info snWHERE a.stat_name = b.stat_nameAND a.snap_id = &end_snapAND a.dbid = sn.db_idAND a.instance_number = sn.instance_number
),
end_value_sys AS (SELECT /*+ use_hash(s) */b.short_name, a.stat_name, a.VALUE, b.st_orderFROM dba_hist_sysstat a, st_list_sys b, db_info snWHERE a.stat_name = b.stat_nameAND a.snap_id = &end_snapAND a.dbid = sn.db_idAND a.instance_number = sn.instance_number
)
SELECT short_name, per_sec, per_tx
FROM (SELECT e.short_name,ROUND((e.VALUE - b.VALUE) / 1000000 / (SELECT d_elp_time FROM elp_time), 2) AS per_sec,ROUND((e.VALUE - b.VALUE) / 1000000 / (SELECT usr_val FROM trx_val), 2) AS per_tx,e.st_orderFROM beg_value_mod b, end_value_mod eWHERE e.stat_name = b.stat_nameAND e.st_order = b.st_orderUNION ALLSELECT e.short_name,CASEWHEN e.st_order IN (11, 12) THENROUND((e.VALUE - b.VALUE) / (SELECT d_elp_time FROM elp_time) / 1024 / 1024, 2)ELSEROUND((e.VALUE - b.VALUE) / (SELECT d_elp_time FROM elp_time), 2)END AS per_sec,CASEWHEN e.st_order IN (11, 12) THENROUND((e.VALUE - b.VALUE) / (SELECT usr_val FROM trx_val) / 1024 / 1024, 2)ELSEROUND((e.VALUE - b.VALUE) / (SELECT usr_val FROM trx_val), 2)END AS per_tx,e.st_orderFROM beg_value_sys b, end_value_sys eWHERE e.stat_name = b.stat_nameAND e.st_order = b.st_orderUNION ALLSELECT e.short_name,ROUND((e.VALUE - b.VALUE) / 1024 / 1024 / (SELECT d_elp_time FROM elp_time), 2) AS per_sec,ROUND((e.VALUE - b.VALUE) / 1024 / 1024 / (SELECT usr_val FROM trx_val), 2) AS per_tx,e.st_orderFROM beg_workarea b, end_workarea eUNION ALLSELECT 'Transactions:',ROUND(usr_val / (SELECT d_elp_time FROM elp_time), 2),NULL,23FROM trx_val
)
ORDER BY st_order;oracle@Yuan awr$
oracle@Yuan awr$ cat Top10ForegroundEvents.sql
DEFINE beg_snap = 1120;
DEFINE end_snap = 1121;
col Waits format 999,999,999,999,999
col "Total Wait Time (sec)" format 999,999,999,999,999
set linesize 200
col Event format a40
set pagesize 100
col "Wait Class" form a20
set verify offWITH cputime_and_dbtime AS (SELECT(SELECT SUM(e.VALUE - b.value) AS diff_valueFROM dba_hist_sys_time_model b,dba_hist_sys_time_model eWHERE e.dbid = b.dbidAND e.instance_number = b.instance_numberAND e.STAT_ID = b.STAT_IDAND b.dbid = (SELECT dbid FROM v$database)AND b.instance_number = (SELECT instance_number FROM v$instance)AND b.snap_id = &beg_snapAND e.snap_id = &end_snapAND e.stat_name = 'DB CPU') AS cputime,(SELECT SUM(e.VALUE - b.value) AS diff_valueFROM dba_hist_sys_time_model b,dba_hist_sys_time_model eWHERE e.dbid = b.dbidAND e.instance_number = b.instance_numberAND e.STAT_ID = b.STAT_IDAND b.dbid = (SELECT dbid FROM v$database)AND b.instance_number = (SELECT instance_number FROM v$instance)AND b.snap_id = &beg_snapAND e.snap_id = &end_snapAND e.stat_name = 'DB time') AS dbtimeFROM dual
)
SELECT event AS "Event",wait_count AS "Waits",ROUND(wait_time_seconds, 2) AS "Total Wait Time (sec)",ROUND(avg_wait_ms, 2) AS "Avg Wait (ms)",ROUND(pct_db_time, 2) AS "% DB Time",wait_class AS "Wait Class"FROM (SELECT event,wait_count,wait_time_microseconds / 1000000 AS wait_time_seconds,DECODE(wait_count, 0, NULL, wait_time_microseconds / wait_count) / 1000 AS avg_wait_ms,DECODE((SELECT dbtime FROM cputime_and_dbtime), 0, NULL, wait_time_microseconds / (SELECT dbtime FROM cputime_and_dbtime)) * 100 AS pct_db_time,wait_classFROM (SELECT event_name AS event,CASEWHEN total_waits_fg IS NOT NULL THEN total_waits_fg - NVL(prev_total_waits_fg, 0)ELSE (total_waits - NVL(prev_total_waits, 0)) - GREATEST(0, (NVL(bg_total_waits, 0) - NVL(prev_bg_total_waits, 0)))END AS wait_count,CASEWHEN time_waited_micro_fg IS NOT NULL THEN time_waited_micro_fg - NVL(prev_time_waited_micro_fg, 0)ELSE (time_waited_micro - NVL(prev_time_waited_micro, 0)) - GREATEST(0, (NVL(bg_time_waited_micro, 0) - NVL(prev_bg_time_waited_micro, 0)))END AS wait_time_microseconds,wait_classFROM (SELECT e.event_name,b.total_waits prev_total_waits,b.total_waits_fg AS prev_total_waits_fg,b.time_waited_micro AS prev_time_waited_micro,b.time_waited_micro_fg AS prev_time_waited_micro_fg,e.total_waits,e.total_waits_fg,e.time_waited_micro,e.time_waited_micro_fg,bg.total_waits AS bg_total_waits,bg.time_waited_micro AS bg_time_waited_micro,bg_prev.total_waits AS prev_bg_total_waits,bg_prev.time_waited_micro AS prev_bg_time_waited_micro,e.wait_classFROM dba_hist_system_event b,dba_hist_system_event e,dba_hist_bg_event_summary bg_prev,dba_hist_bg_event_summary bgWHERE b.snap_id(+) = &beg_snapAND e.dbid= (SELECT dbid FROM v$database)AND e.snap_id = &end_snapAND bg_prev.snap_id(+) = &beg_snapAND bg.snap_id(+) = &end_snapAND e.instance_number = (SELECT instance_number FROM v$instance)AND e.dbid = b.dbid(+)AND e.instance_number = b.instance_number(+)AND e.event_id = b.event_id(+)AND e.dbid = bg.dbid(+)AND e.instance_number = bg.instance_number(+)AND e.event_id = bg.event_id(+)AND e.dbid = bg_prev.dbid(+)AND e.instance_number = bg_prev.instance_number(+)AND e.event_id = bg_prev.event_id(+)AND e.total_waits > NVL(b.total_waits, 0)AND e.wait_class <> 'Idle'UNION ALLSELECT 'DB CPU' AS event_name,NULL AS prev_total_waits,NULL AS prev_total_waits_fg,NULL AS prev_time_waited_micro,NULL AS prev_time_waited_micro_fg,NULL AS total_waits,NULL AS total_waits_fg,(SELECT cputime FROM cputime_and_dbtime) AS time_waited_micro,(SELECT cputime FROM cputime_and_dbtime) AS time_waited_micro_fg,NULL AS bg_total_waits,NULL AS bg_time_waited_micro,NULL AS prev_bg_total_waits,NULL AS prev_bg_time_waited_micro,' ' AS wait_classFROM dualWHERE (SELECT cputime FROM cputime_and_dbtime) > 0)ORDER BY wait_time_microseconds DESC, wait_count DESC)WHERE ROWNUM <= 10);
目前号主在certview.oracle.com网站上的证书清单截图。
关于号主,姚远:
- Oracle ACE(Oracle和MySQL数据库方向)
- 华为云最有价值专家
- 《MySQL 8.0运维与优化》的作者
- 拥有 Oracle 10g、12c和19c OCM等数十项数据库认证
- 曾任IBM公司数据库部门经理
- 20+年DBA经验,服务2万+客户
- 精通C和Java,发明两项计算机专利