AWR的本质是通过定时采样,收集数据库的性能数据,然后通过报表进行直观展现,以下摘录一些生成报表的SQL,可以据此了解一下Oracle AWR的内部展现机制。
在使用awrrpt.sql生成报告时,会调用awrrpti.sql脚本,该脚本的主要部分为:
select output from table(dbms_workload_repository. &fn_name( :dbid,:inst_num,:bid,:eid,:rpt_options ));
复制
这里的fn_name是根据用户输入的选项来选择调用AWR_REPORT_HTML或AWR_REPORT_TEXT函数。
AWR_REPORT_HTML函数的内容如下,其主要内容是调用了另外一个过程DBMS_SWRF_REPORT_INTERNAL:
FUNCTION AWR_REPORT_HTML(L_DBID IN NUMBER, L_INST_NUM IN NUMBER, L_BID IN NUMBER, L_EID IN NUMBER, L_OPTIONS IN NUMBER DEFAULT 0) RETURN AWRRPT_HTML_TYPE_TABLE PIPELINED IS I NUMBER; ARR DBMS_SWRF_REPORT_INTERNAL.OUTPUT_TABLE; BEGIN ARR := DBMS_SWRF_REPORT_INTERNAL.AWR_REPORT_MAIN(L_DBID, L_INST_NUM, L_BID, L_EID, L_OPTIONS, DBMS_SWRF_REPORT_INTERNAL.TRUE_I); FOR I IN ARR.FIRST..ARR.LAST LOOP PIPE ROW(AWRRPT_HTML_TYPE(SUBSTR(ARR(I), 1, DBMS_SWRF_REPORT_INTERNAL.HTML_REPORT_LINESIZE))); END LOOP; DBMS_SWRF_REPORT_INTERNAL.REPORT_CLEANUP(); END AWR_REPORT_HTML;
复制
这里的AWR_REPORT_MAIN是最重要的一个函数:
FUNCTION AWR_REPORT_MAIN(L_DBID IN NUMBER, L_INST_NUM IN NUMBER, L_BID IN NUMBER, L_EID IN NUMBER, L_OPTIONS IN NUMBER DEFAULT OPT_NULL, TO_HTML IN BINARY_INTEGER DEFAULT TRUE_I) RETURN OUTPUT_TABLE;
复制
该函数的主要内容如下:
FUNCTION AWR_REPORT_MAIN(L_DBID IN NUMBER, L_INST_NUM IN NUMBER, L_BID IN NUMBER, L_EID IN NUMBER, L_OPTIONS IN NUMBER DEFAULT OPT_NULL, TO_HTML IN BINARY_INTEGER DEFAULT TRUE_I) RETURN OUTPUT_TABLE --返回一个输出表内容 IS BEGIN REPORT_CLEANUP(); CHECK_PARAMETERS(L_DBID,L_INST_NUM,L_BID,L_EID); SET_THRESHOLD; REPORT_INIT(L_DBID, L_INST_NUM, L_BID, L_EID, RPT_STATS, RPT_PARAMS, RPT_TIME_VALS); --报表初始化 IF (TO_HTML = TRUE_I) THEN BEGIN_REPORT_TAGS('AWR Report'); END IF; REPORT_SUMMARY(L_DBID, L_INST_NUM, L_BID, L_EID, L_OPTIONS, TO_HTML, FALSE_I); --生成报表概要 DISPLAY_SUBTREES_OF(MAIN_REPT, TO_HTML, L_OPTIONS, L_DBID, L_INST_NUM, L_BID, L_EID); --生成报表其他部分 DISPLAY_SUBTREES_OF(RAC_REPT, TO_HTML, L_OPTIONS, L_DBID, L_INST_NUM, L_BID, L_EID); --生成报表的RAC部分信息 APPEND_ROW(END_REPORT); IF (TO_HTML = TRUE_I) THEN END_REPORT_TAGS(); END IF; RETURN RPT_ROWS; END AWR_REPORT_MAIN;
复制
接下来数据库就会在主要的过程中调用各种SQL生成报表的各部分内容,如以下就是展现等待事件的查询:
SELECT EVENT, WAITS, TIME, DECODE(WAITS, NULL, TO_NUMBER(NULL), 0, TO_NUMBER(NULL), TIME/WAITS*1000) AVGWT, PCTWTT, WAIT_CLASS FROM (SELECT EVENT, WAITS, TIME, PCTWTT, WAIT_CLASS FROM (SELECT E.EVENT_NAME EVENT, E.TOTAL_WAITS - NVL(B.TOTAL_WAITS,0) WAITS, (E.TIME_WAITED_MICRO - NVL(B.TIME_WAITED_MICRO,0)) / 1000000 TIME, 100 * (E.TIME_WAITED_MICRO - NVL(B.TIME_WAITED_MICRO,0)) / RPT_STATS(STAT_DBTIME) PCTWTT, E.WAIT_CLASS WAIT_CLASS FROM DBA_HIST_SYSTEM_EVENT B, DBA_HIST_SYSTEM_EVENT E WHERE B.SNAP_ID(+) = L_BID AND E.SNAP_ID = L_EID AND B.DBID(+) = L_DBID AND E.DBID = L_DBID AND B.INSTANCE_NUMBER(+) = L_INST_NUM AND E.INSTANCE_NUMBER = L_INST_NUM AND B.EVENT_ID(+) = E.EVENT_ID AND E.TOTAL_WAITS > NVL(B.TOTAL_WAITS,0) AND E.WAIT_CLASS != 'Idle' UNION ALL SELECT 'CPU time' EVENT, TO_NUMBER(NULL) WAITS, RPT_STATS(STAT_CPU_TIME)/1000000 TIME, 100 * RPT_STATS(STAT_CPU_TIME) / RPT_STATS(STAT_DBTIME) PCTWTT, NULL WAIT_CLASS FROM DUAL WHERE RPT_STATS(STAT_CPU_TIME) > 0) ORDER BY TIME DESC, WAITS DESC) WHERE ROWNUM <= TOP_N_EVENTS;
复制
各类SQL不再过多介绍,了解了AWR的展现原理,我们就可以灵活的去分析各种AWR数据,获得更有价值的信息。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
【纯干货】Oracle 19C RU 19.27 发布,如何快速升级和安装?
Lucifer三思而后行
790次阅读
2025-04-18 14:18:38
Oracle RAC 一键安装翻车?手把手教你如何排错!
Lucifer三思而后行
665次阅读
2025-04-15 17:24:06
Oracle数据库一键巡检并生成HTML结果,免费脚本速来下载!
陈举超
595次阅读
2025-04-20 10:07:02
【ORACLE】你以为的真的是你以为的么?--ORA-38104: Columns referenced in the ON Clause cannot be updated
DarkAthena
550次阅读
2025-04-22 00:13:51
【活动】分享你的压箱底干货文档,三篇解锁进阶奖励!
墨天轮编辑部
535次阅读
2025-04-17 17:02:24
【ORACLE】记录一些ORACLE的merge into语句的BUG
DarkAthena
510次阅读
2025-04-22 00:20:37
一页概览:Oracle GoldenGate
甲骨文云技术
500次阅读
2025-04-30 12:17:56
火焰图--分析复杂SQL执行计划的利器
听见风的声音
472次阅读
2025-04-17 09:30:30
OR+DBLINK的关联SQL优化思路
布衣
383次阅读
2025-05-05 19:28:36
3月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
383次阅读
2025-04-15 14:48:05
TA的专栏