首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Top 10 Foreground Events by Total Wait Time源码

Top 10 Foreground Events by Total Wait Time源码

作者头像
姚远OracleACE
发布2025-10-24 14:34:03
发布2025-10-24 14:34:03
890
举报
文章被收录于专栏:oracleaceoracleace

源码运行结果如下图:

源码是我写的,不是Oracle的源码:

代码语言:javascript
复制


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 off

WITH cputime_and_dbtime AS (
  SELECT
    (SELECT SUM(e.VALUE - b.value) AS diff_value
       FROM dba_hist_sys_time_model b,
            dba_hist_sys_time_model e
      WHERE e.dbid = b.dbid
        AND e.instance_number = b.instance_number
        AND e.STAT_ID = b.STAT_ID
        AND b.dbid = (SELECT dbid FROM v$database)
        AND b.instance_number = (SELECT instance_number FROM v$instance)
        AND b.snap_id = &beg_snap
        AND e.snap_id = &end_snap
        AND e.stat_name = 'DB CPU') AS cputime,
    (SELECT SUM(e.VALUE - b.value) AS diff_value
       FROM dba_hist_sys_time_model b,
            dba_hist_sys_time_model e
      WHERE e.dbid = b.dbid
        AND e.instance_number = b.instance_number
        AND e.STAT_ID = b.STAT_ID
        AND b.dbid = (SELECT dbid FROM v$database)
        AND b.instance_number = (SELECT instance_number FROM v$instance)
        AND b.snap_id = &beg_snap
        AND e.snap_id = &end_snap
        AND e.stat_name = 'DB time') AS dbtime
  FROM 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_class
      FROM (
        SELECT event_name AS event,
               CASE
                 WHEN 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,
               CASE
                 WHEN 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_class
          FROM (
            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_class
              FROM dba_hist_system_event b,
                   dba_hist_system_event e,
                   dba_hist_bg_event_summary bg_prev,
                   dba_hist_bg_event_summary bg
             WHERE b.snap_id(+) = &beg_snap
               AND e.dbid= (SELECT dbid FROM v$database)
               AND e.snap_id = &end_snap
               AND bg_prev.snap_id(+) = &beg_snap
               AND bg.snap_id(+) = &end_snap
               AND 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 ALL
            SELECT '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_class
              FROM dual
             WHERE (SELECT cputime FROM cputime_and_dbtime) > 0
          )
         ORDER BY wait_time_microseconds DESC, wait_count DESC
      )
     WHERE ROWNUM <= 10
  );

使用浏览器打开文章,粘贴源码格式更工整。

关于号主,姚远:

  • Oracle ACE(Oracle和MySQL数据库方向)
  • 华为云最有价值专家
  • 《MySQL 8.0运维与优化》的作者
  • 拥有 Oracle 10g、12c和19c OCM等数十项数据库认证
  • 曾任IBM公司数据库部门经理
  • 20+年DBA经验,服务2万+客户
  • 精通C和Java,发明两项计算机专利
  • 两次获得国家部级奖

推荐文章👇

程序员如何练到英语专业八级水平?我的亲身经历

从我的经历看IT工程师能干到退休吗?

试看号主拙作《MySQL 8.0运维与优化》

号主在certview.oracle.com网站上的证书清单截图:

欢迎关注我的公众号,一起学习数据库技术,分享职业发展的思考。

欢迎加我的微信,拉你进微信群

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-10-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 oracleace 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档