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分钟)。
示例参数输入代码如下:
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 和对象:
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 和对象:
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 和对象:
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)

Oracle DBA必备脚本:一条SQL统计Oracle ASH中EVENT、SQL、OBJECT_ID的热点,快速定位性能或故障点的更多相关文章
- 警惕 MySql 更新 sql 的 WHERE 从句中的 IN() 子查询时出现的性能陷阱
警惕 MySql 更新 sql 的 WHERE 从句中的 IN() 子查询时出现的性能陷阱 以下文章来源:https://blog.csdn.net/defonds/article/details/4 ...
- 监控SQL:执行表中所有sql语句、记录每个语句运行时间(3)
原文:监控SQL:执行表中所有sql语句.记录每个语句运行时间(3) 通过执行一个 带参数的存储过程 exec OpreateTB('OpreateUser','IsRun') 更新表的数据 表 ...
- SQL Server R2 2008中的SQL Server Management Studio 阻止保存要求重新创建表的更改问题的设置方法
在2008中会加入阻止保存要求重新创建表的更改这个选项.症状表现为修改表结构的时候会"阻止"你. SQL Server 2008“阻止保存要求重新创建表的更改”的错误的解决方案是本 ...
- Oracle DBA从小白到入职实战应用
现如今Oracle依然是RDBMS的王者,在技术上和战略上,Oracle仍然一路高歌猛进,并且全面引领行业迈入了云时代,伴随着12cR2即将在2016年正式发布,学习Oracle之路依旧任重道远,目前 ...
- Oracle DBA面试突击题
一份ORACLE DBA面试题 一:SQL tuning 类 1:列举几种表连接方式 答: Oracle的多表连接算法有Nest Loop.Sort Merge和Hash Join三大类,每一类又可以 ...
- MS SQL统计信息浅析下篇
MS SQL统计信息浅析上篇对SQL SERVER 数据库统计信息做了一个整体的介绍,随着我对数据库统计信息的不断认识.理解,于是有了MS SQL统计信息浅析下篇. 下面是我对SQL Serve ...
- 在Windows Server 2012 R2中搭建SQL Server 2012故障转移集群
需要说明的是我们搭建的SQL Server故障转移集群(SQL Server Failover Cluster)是可用性集群,而不是负载均衡集群,其目的是为了保证服务的连续性和可用性,而不是为了提高服 ...
- Oracle 史上最全近百条Oracle DBA日常维护SQL脚本指令
史上最全近百条Oracle DBA日常维护SQL脚本指令 https://mp.weixin.qq.com/s?__biz=MjM5MDAxOTk2MQ==&mid=2650281305&am ...
- Oracle DBA常用SQL
监控SQL 1.监控事例的等待: select event,sum(decode(wait_time,0,0,1)) prev, sum(decode(wait_time,0,1,0)) curr,c ...
- Oracle DBA 必须掌握的 查询脚本:
Oracle DBA 必须掌握的 查询脚本: 0:启动与关闭 orcle 数据库的启动与关闭 1:连接数据库 2:数据库开启状态的实现步骤: 2-1:启动数据库 2- ...
随机推荐
- wpf 代码判断当前是否在设计模式,兼容没有UI线程的限制
/// <summary> /// 当前是否处于设计模式 /// </summary> bool IsInDesignMode { get { return (bool)Des ...
- 2docker私有镜像仓库registry
3 docker私有镜像仓库 3.1准备服务器 重新安装CENTOS7,加大磁盘空间. ip 配置 登录 192.168.168.168 4核虚拟CPU/4G内存/300G磁盘 22/密钥登陆/LCZ ...
- 使用Tortoise-ORM和FastAPI构建评论系统
title: 使用Tortoise-ORM和FastAPI构建评论系统 date: 2025/04/25 21:37:36 updated: 2025/04/25 21:37:36 author: c ...
- SpringMVC返回值
字符串 /** * 测试返回字符串 * @param model model * @return 返回的字符串,通过视图解析器调整到jsp页面 */ @RequestMapping("/te ...
- SQL 强化练习 (八)
继续练习写sql, 不能停下来. 今天还额外对 Excel 拼接 sql 语句做了一个代码实现, 逻辑是蛮简单的, 发现其实很多东西都是蛮简单的, 只要一点点去做, 明白逻辑过后, 慢慢去调试, 都是 ...
- Kubernetes 调度器打分算法详解:LeastAllocated 与 NodeAffinity
1️⃣ NodeResourcesLeastAllocated(资源最少分配) 目标 优先将 Pod 调度到资源使用率最低的节点,防止热点节点,尽量实现负载均衡. 打分算法原理 对每个节点计算 CPU ...
- 装在U盘或移动固态硬盘里的系统——适用于Ventoy和VirtualBox的Win to go 和 Linux to go 系统制作教程
写在前面 前段时间, 突然想起了大学期间折腾过的双系统, 又恰逢最近学习工作需要用到Linux系统环境, 用虚拟机又感觉性能跟不上, 因此萌生了一个用移动固态硬盘安装双系统的想法. 照着网络上各位老师 ...
- C# Task 取消执行的简单封装
我让DeepSeek帮我写了一段使用 CancellationTokenSource 取消任务的简单示例如下: 取消任务的简单示例 using System.Threading.Tasks; usin ...
- 搭建第一个vue项目
第一:你需要在Windows环境下面搭建vue的开发环境,具体可参考如下的地址: https://www.cnblogs.com/zhaomeizi/p/8483597.html 第二:当你搭建好之后 ...
- Python 潮流周刊#106:PEP-734 正式接纳,多解释器时代来临(摘要)
本周刊由 Python猫 出品,精心筛选国内外的 400+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...