Oracle DBA必备脚本:一条SQL统计Oracle ASH中EVENT、SQL、OBJECT_ID的热点,快速定位性能或故障点

我们的文章会在微信公众号IT民工的龙马人生博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢!

由于博客中有大量代码,通过页面浏览效果更佳。

背景介绍

Oracle 的 ASH(Active Session History,活动会话历史)功能可以说是数据库领域的标杆,许多其他数据库都在模仿,但始终未能超越。ASH 对于分析数据库历史故障和性能瓶颈有着极其重要的作用,已经成为 Oracle DBA 日常工作中不可或缺的工具。

然而,Oracle 默认提供的 ASH 可视化界面过于简单,面对复杂的故障排查和性能分析时,往往难以满足实际需求。为此,本文分享一个本人常用的 ASH 分析脚本。该脚本可以根据 wait_class 的值,快速定位会话的 event、SQL 语句以及正在访问的 object_id,并统计每个时间间隔内 event、sql、object_id 出现的次数,并按次数排序,帮助你迅速锁定数据库的热点和瓶颈。

本次分享的脚本还做了重要的迭代优化。起因是一位兄弟在使用过程中,遇到 CPU 使用率很高的情况,但 ASH 的 wait_class 中并没有 CPU 相关的等待事件,导致原脚本查询结果为空。新版脚本修复了这个问题:当输入 ON CPU 时,会自动关联 session_state 字段,确保能够正确统计 CPU 使用情况,满足实际分析需求。

脚本作用

该脚本的主要目的是提升 ASH 数据分析的效率,帮助 DBA 快速定位数据库的性能瓶颈或故障点。需要注意的是,脚本本身只是工具,最终的故障和性能分析还需结合自身的知识积累和其他辅助脚本共同完成。

脚本获取

关注公众号,回复 ash_object_by_waitclass 获取脚本源码。

目前正在考虑建一个微信群或者通过其它什么方式共享脚本,这样方便大家获取。

脚本参数说明

  • begin_hours:查询 ASH 记录的起始时间,距离当前时间多少小时(默认2小时)。
  • interval_hours:需要查询的时间区间长度,单位为小时(默认2小时)。
  • waitclass:session.wait_class 的值,也可以输入 ON CPU(默认 User I/O)。
  • display_time:结果中每个时间段的间隔,单位为分钟(默认10分钟)。

示例参数输入代码如下:

plain_text 复制代码
ACCEPT begin_hours prompt 'Enter Search Hours Ago (i.e. 2(default)) : '  default '2'
ACCEPT interval_hours prompt 'Enter How Interval Hours  (i.e. 2(default)) : ' default '2'
ACCEPT waitclass prompt 'Enter Search Wait Class  (i.e. User I/O(default) Or ON CPU) : ' default 'User I/O'
ACCEPT display_time prompt 'Enter How Display Interval Minute  (i.e. 10(default)) : ' default '10'
variable begin_hours number;
variable interval_hours number;
variable time number;
variable waitclass varchar2(200);
begin
   :begin_hours:=&begin_hours;
   :interval_hours:=&interval_hours;
   :time:=&display_time;
   :waitclass:='&waitclass';
   end;
   /

脚本使用案例

1. ON CPU 的案例

当数据库 CPU 使用率较高时,可以通过输入 ON CPU,快速定位消耗 CPU 资源最多的 SQL 和对象:

plain_text 复制代码
www.htz.pw > @ash_object_by_waitclass
Enter Search Hours Ago (i.e. 2(default)) : 
Enter How Interval Hours  (i.e. 2(default)) : 
Enter Search Wait Class  (i.e. User I/O(default)) : ON CPU
Enter How Display Interval Minute  (i.e. 10(default)) : 

PL/SQL procedure successfully completed.


                                                                                                                  EVENT
                                                                                             EVENT                SQLID
                                                                EVENT                        SQLID               OBJECT
TIME              EVENT                                          ROWS SQL_ID                  ROWS  OBJECT_ID      ROWS
----------------- ---------------------------------------- ---------- ------------------ --------- ---------- ---------
20250717 18 50-60 ON CPU                                           17                            6         -1         6
                                                                      75ajb6njq3124             11       9165        11
20250717 19 0-10  ON CPU                                           30 bjck50zs3nc95              1         -1         1
                                                                      c179sut1vgpc8              1       9201         1
                                                                                                28         -1        28
20250717 19 10-20 ON CPU                                            9                            9         -1         9
20250717 19 20-30 ON CPU                                            9 1kb56hd6c73bv              1         -1         1
                                                                                                 8         -1         8
20250717 19 30-40 ON CPU                                           30 8jdqkyxggndcw             11         -1        11
                                                                                                18         -1        18
20250717 19 40-50 ON CPU                                            5                            5         -1         5
20250717 19 50-60 ON CPU                                            9 22356bkgsdcnh              1         -1         1
                                                                      3kqrku32p6sfn              1         -1         1
                                                                                                 7       9165         1
                                                                                                           -1         6
20250717 20 0-10  ON CPU                                            4                            4         -1         4
20250717 20 10-20 ON CPU                                            8                            8         -1         8
20250717 20 20-30 ON CPU                                           16 772s25v1y0x8k              1         -1         1
                                                                      3kqrku32p6sfn              1         -1         1
                                                                                                14         -1        14
20250717 20 30-40 ON CPU                                            9                            9         -1         9
20250717 20 40-50 ON CPU                                            6 fs9wrcc7k8f3k              2         -1         2
                                                                                                 3         -1         3

23 rows selected.

SQL> 

2. Concurrency 的案例

分析并发相关的等待事件,快速定位热点 SQL 和对象:

plain_text 复制代码
www.htz.pw > @ash_object_by_waitclass.sql
Enter Search Hours Ago (i.e. 2(default)) : 80
Enter How Interval Hours  (i.e. 2(default)) : 80
Enter Search Wait Class  (i.e. User I/O(default)) : Concurrency
Enter How Display Interval Minute  (i.e. 10(default)) :

PL/SQL procedure successfully completed.


                                                                                                                  EVENT
                                                                                             EVENT                SQLID
                                                                EVENT                        SQLID               OBJECT
TIME              EVENT                                          ROWS SQL_ID                  ROWS  OBJECT_ID      ROWS
----------------- ---------------------------------------- ---------- ------------------ --------- ---------- ---------
20180913 18 10-20 buffer busy waits                                10 7ytmm161fqh7v             10     173776        10
                  row cache lock                                   20 8kjczmwr880g7             10         -1        10
                                                                      ffmu1hmx015xp             10         -1        10
20180913 18 30-40 row cache lock                                   10 fayj2tt0raq1y             10         -1        10
20180913 19 20-30 row cache lock                                   10 g95n7p77a7wf1             10         -1        10
20180913 20 50-60 os thread startup                                10                           10         -1        10
20180913 22 0-10  os thread startup                                10                           10         -1        10
                  library cache lock                             1130 6g7kr8p1khd7j            270         -1       270
                                                                      b6usrg82hwsa3            560        185        40
                                                                                                        28057       520
20180913 22 10-20 cursor: pin S wait on X                         970 2dd14pvvq1dtd            390         -1       170
                                                                                                       111549       210
                                                                      7bmv0x3jk3s4m            580     143758       580
                  library cache lock                             3060 b6usrg82hwsa3            580         -1       210
                                                                                                        28057       370
                                                                      6g7kr8p1khd7j            990         -1       990
20180913 22 20-30 library cache lock                             1620 b6usrg82hwsa3            590         -1       590
                                                                      2dd14pvvq1dtd           1030         -1       440
                                                                                                       111549       590
                  cursor: pin S wait on X                        5650 2dd14pvvq1dtd           5650         -1       960
                                                                                                       111549      2740
20180913 22 30-40 library cache lock                              270 b6usrg82hwsa3             90         -1        90
                                                                      2dd14pvvq1dtd            180     111549        90
                                                                                                           -1        90
                  cursor: pin S wait on X                        1170 2dd14pvvq1dtd           1170         -1       180
                                                                                                            0       180
                                                                                                       111549       630
20180914 00 0-10  os thread startup                                10 g9b1kcgyr8ryx             10         -1        10
20180914 00 20-30 os thread startup                                10 g9b1kcgyr8ryx             10         -1        10
20180914 00 50-60 os thread startup                                10                           10         -1        10
20180914 01 10-20 os thread startup                                10                           10         -1        10
20180914 03 10-20 os thread startup                                10                           10         -1        10
20180914 05 0-10  os thread startup                                10                           10        288        10
20180914 06 50-60 os thread startup                                10                           10         -1        10
20180914 08 10-20 enq: TX - index contention                       10 7ytmm161fqh7v             10     173775        10
20180914 10 30-40 enq: TX - index contention                       10 7ytmm161fqh7v             10     173776        10
20180914 11 10-20 row cache lock                                   10 ffmu1hmx015xp             10         -1        10
20180914 11 20-30 row cache lock                                   10 1jj49r1jt4t4y             10         -1        10
20180914 11 30-40 enq: TX - index contention                       10 7ytmm161fqh7v             10     173776        10
20180914 12 30-40 os thread startup                                10                           10         -1        10
20180914 12 40-50 row cache lock                                   20 fayj2tt0raq1y             10         -1        10
                                                                      96j8cy524bfqb             10         -1        10
20180914 13 40-50 row cache lock                                   10 fayj2tt0raq1y             10         -1        10
20180914 13 50-60 row cache lock                                   10 ffmu1hmx015xp             10         -1        10
20180914 14 50-60 row cache lock                                   10 96j8cy524bfqb             10         -1        10
20180914 15 0-10  buffer busy waits                                10 7ytmm161fqh7v             10     173776        10

3. Cluster 的案例

分析集群相关的等待事件,定位分布式环境下的热点 SQL 和对象:

plain_text 复制代码
SQL> @ash_object_by_waitclass.sql
Enter Search Hours Ago (i.e. 2(default)) : 25
Enter How Interval Hours  (i.e. 2(default)) : 5
Enter Search Wait Class  (i.e. User I/O(default)) : Cluster
Enter How Display Interval Minute  (i.e. 10(default)) :

                                                                                                                  EVENT
                                                                                             EVENT                SQLID
                                                                EVENT                        SQLID               OBJECT
TIME              EVENT                                          ROWS SQL Id                  ROWS  OBJECT_ID      ROWS
----------------- ---------------------------------------- ---------- ------------------ --------- ---------- ---------
20180427 13 40-50 gc cr multi block request                      1050 1ka1qdn7q0p31             50      60302        50
                                                                      3nbv4gnswqm56             50      60303        50
                                                                      27hzdsfkrxw23            100      66094       100
                  gc buffer busy acquire                         1050 gmvgp65fqsh8b            410      60317       410
                                                                      0kyq1wwhfnap9            420      60261       420
                  gc cr grant congested                          1110 27hzdsfkrxw23            130      69526        60
                                                                                                        66094        70
                                                                      cyxcv5dry802q            140      68617        40
                                                                                                        66080       100
20180427 13 50-60 gc buffer busy acquire                        12570 0kyq1wwhfnap9           4420      60261      4420
                                                                      gmvgp65fqsh8b           4590      60317      4590
                  gc cr multi block request                     13600 gmvgp65fqsh8b            550      60317       550
                                                                      27hzdsfkrxw23           1290      66094      1290
20180427 14 0-10  gc cr grant congested                         13330 bxhqmzrr9scrs           1650      66089       410
                                                                                                        69493       450
                                                                      27hzdsfkrxw23           1650      69526       520
                                                                                                        66094      1130
                                                                      cyxcv5dry802q           2050      68617       620
                                                                                                        66080      1430
                  gc cr multi block request                     14840 27hzdsfkrxw23           1020      66094      1020
                                                                      5483m8kvctdqr           1050      62092      1050
20180427 14 10-20 gc cr grant congested                         12590 27hzdsfkrxw23           1660      69526       500
                                                                                                        66094      1160
                                                                      cyxcv5dry802q           1940      68617       630
                                                                                                        66080      1310
                  gc cr multi block request                     12690 27hzdsfkrxw23           1000      66094      1000
                                                                      5483m8kvctdqr           1080      62092      1080
20180427 14 20-30 gc buffer busy acquire                        12630 0kyq1wwhfnap9           4540      60261      4540
                                                                      gmvgp65fqsh8b           4640      60317      4640
                  gc cr multi block request                     15260 27hzdsfkrxw23           1000      66094      1000
                                                                      5483m8kvctdqr           1130      62092      1130
20180427 14 30-40 gc cr grant congested                         14110 27hzdsfkrxw23           2110      69526       580
                                                                                                        66094      1530
                                                                      cyxcv5dry802q           2250      68617       740
                                                                                                        66080      1510
                  gc cr multi block request                     15010 27hzdsfkrxw23           1080      66094      1080
                                                                      5483m8kvctdqr           1110      62092      1110
20180427 14 40-50 gc buffer busy acquire                        12050 gmvgp65fqsh8b           4360      60317      4360
                                                                      0kyq1wwhfnap9           4470      60261      4470
                  gc cr multi block request                     13500 5483m8kvctdqr           1030      62092      1030
                                                                      27hzdsfkrxw23           1050      66094      1050
20180427 14 50-60 gc cr multi block request                      5620 27hzdsfkrxw23            400      66094       400
                                                                      5483m8kvctdqr            640      62092       640
                  gc buffer busy acquire                         7030 gmvgp65fqsh8b           1430      60317      1430
                                                                      0kyq1wwhfnap9           4090      60261      4090
20180427 15 0-10  gc cr multi block request                      1580 0baxsbcdg6wz9            280      66089       280
                                                                      0kyq1wwhfnap9            280      60261       280
                                                                      c7pfrkpmwsh1g            320      66079       320
                  gc buffer busy acquire                         4300 d7xh377d3sc7d            400      66089       400
                                                                      0kyq1wwhfnap9           3510      60261      3510
20180427 15 10-20 gc cr grant 2-way                               340 cyxcv5dry802q             40      68617        10
                                                                                                        66080        30
                                                                      01mhyzkpv1rvz             60      66094        20
                                                                                                        69525        40
                  gc cr multi block request                       620 3x44s9jnkrtc7            110      62080       110
                                                                      5483m8kvctdqr            230      62092       230

总结

通过本脚本,DBA 可以在指定时间区间内,按等待类(如 User I/O、ON CPU、Concurrency、Cluster 等)统计 Oracle 活动会话历史,分层次(事件、SQL、对象)展示每层 Top N 的热点,极大提升了故障定位和性能分析的效率。希望这个脚本能为你的日常运维和故障排查带来帮助!

如有疑问或建议,欢迎留言交流!

------------------作者介绍-----------------------

姓名:黄廷忠

现就职:Oracle中国高级服务团队

曾就职:OceanBase、云和恩墨、东方龙马等

电话、微信、QQ:18081072613
个人博客: (http://www.htz.pw)
CSDN地址: (https://blog.csdn.net/wwwhtzpw)
博客园地址: (https://www.cnblogs.com/www-htz-pw)


相关推荐
云端拾光2 个月前
从需求到复盘,领歌如何驱动银行经营贷项目全流程敏捷落地?
团队协作·敏捷团队·工具分享·看板·看板工具
惠惠软件9 个月前
微软数据恢复工具- “快速扫描” 和 “深度扫描” 两种模式 快速扫描的速度更快,使用 NTFS 文件系统下的目录结构
microsoft·工具分享·专业数据恢复
惠惠软件2 年前
安卓Ampere Pro(充电评测)v4.09解锁专业版,供大家学习研究参考!
学习·充放电·工具分享·安卓系统·电池监控软件