awr报告中top 5 events指拖慢数据库最严重的5个等待事件,按总等待时间(time_waited)降序排列,反映cpu外的资源瓶颈,需结合参数、上下文及对比分析定位根因。
awr报告里top 5 events到底在说啥
top 5 events不是“最常发生的等待”,而是“拖慢数据库最狠的5个等待事件”——它按time_waited(总等待时间)降序排列,直接反映cpu之外的资源瓶颈。比如db file sequential read排第一,说明单块读成了性能杀手;log file sync靠前,大概率是应用提交太频繁或redo写入慢。
常见Top 5 Events对应的真实问题
别只看名字,得结合参数和上下文判断:
-
db file sequential read:平均等待时间avg wait ms> 10ms?磁盘I/O慢或索引失效;若file#集中在某个表空间,可能是大表没分区或统计信息过期 -
enq: TX - row lock contention:不是锁太多,而是事务持有锁太久(比如未提交、长事务、应用重试逻辑卡住),查v$session里blocking_session和sql_id -
library cache lock:DDL正在执行,或大量硬解析(parse count (hard)飙升),检查是否频繁修改同名对象、绑定变量用错、shared_pool过小 -
latch: shared pool:SQL文本未绑定变量,或cursor_sharing=force引发过度子游标,也可能是shared_pool碎片化严重
怎么快速定位Top 5背后的SQL和会话
AWR报告本身不直接显示SQL,但能顺藤摸瓜:
- 在Top 5 Events表格右侧找
%Total列,挑占比>10%的事件,记下时间段(如09:00–10:00) - 翻到报告末尾的
SQL ordered by Gets或SQL ordered by Elapsed Time,筛选同一时段的SQL,比对执行频率与等待事件发生频次 - 用
SELECT * FROM dba_hist_active_sess_history WHERE event = 'log file sync' AND sample_time BETWEEN ...反查具体会话和sql_id - 拿到
sql_id后,用SELECT * FROM v$sql WHERE sql_id = 'xxx'看executions、elapsed_time/ executions、buffer_gets/executions是否异常
别被“Top 5”带偏:这些细节决定诊断成败
Top 5 Events是快照,不是实时流。两个关键点常被忽略:
- 对比相邻两份AWR(比如慢时vs正常时),看哪个事件增幅最大,而不是只盯当前Top 1
-
time_waited单位是厘秒(centiseconds),不是毫秒——数值看着大,实际可能就几十毫秒,得换算后再判断是否真异常 - 某些事件(如
SQL*Net message from client)本质是空闲等待,排进Top 5往往意味着应用端处理慢或网络延迟高,不是数据库问题
真正卡顿的时候,Top 5只是入口,背后连着SQL执行计划、IO路径、内存分配、甚至存储阵列响应曲线——盯住它,但别止步于它。











