Top 5 Timed Foreground Events需结合三个维度(total_wait_time、avg_wait_time、wait_count)分析,而非仅看占比;重点关注CPU、Commit、RAC类事件,并用ASH验证根因。

Top 5 Timed Foreground Events不是“占比最高就该修”
这个页面的数字是聚合统计,不是因果清单。单独看“log file sync 占 DB Time 18%”毫无意义——得拆开看三个维度:total_wait_time、avg_wait_time、wait_count。比如:
-
log file sync占比 12%,但avg_wait_time是 896 µs、wait_count达 140 万次 → 实际是应用层事务太碎,不是磁盘或 LGWR 慢 -
gc buffer busy acquire占比仅 1.2%,avg_wait_time却高达 15 ms,且只由 10 个活跃会话触发 → 极大概率是 RAC 热点块争用,不是整体负载问题 -
SQL*Net message from client没进 Top 5 就基本不用管;真要查网络,盯SQL*Net more data to client或超时类事件
重点关注三类事件:CPU、Commit、RAC
别被“DB CPU 排第一”带偏节奏。它不等于要加 CPU,而是线索起点:
- CPU 类:
DB CPU高 → 翻到「SQL ordered by CPU Time」,找真正吃 CPU 的 SQL,再看执行计划是否走了全表扫描或没走索引 - Commit 类:
log file sync高 → 查commits次数是否异常(Report Summary 里有),再确认 LGWR 写日志路径是否落在慢盘、归档是否阻塞、redo log size 是否过小 - RAC 类:
gc cr block lost平均等待 >1 秒 → 必须立刻结合GV$CLUSTER_INTERCONNECT查私网延迟,而不是调 SQL
db file sequential read 高,不等于缺索引
单块读多,常见但误导性极强。它可能是索引缺失,也可能是别的问题:
- 绑定变量窥探失效 → 执行计划错选索引,实际走大量
db file sequential read - 小表被频繁全扫 → Logical reads 高但 Physical reads 低,
db file sequential read反而高(因为缓存命中率低) - 热块争用 → 多个会话反复读同一块,
wait_count高但total_wait_time不一定突出 - 查具体对象:从
v$session_wait拿p1(file_id) 和p2(block_id),再联查dba_extents定位段名和类型
Load Profile 是验证工具,不是诊断入口
它反映的是“干了多少活”,不是“卡在哪”。数值正常 ≠ 没问题,数值异常 ≠ 瓶颈所在:
-
Physical reads/sec突增 → 看 Load Profile 中Physical reads / Logical reads比值:若比值同步飙升 → 真实物理 IO 增多;若比值稳定甚至下降 → Buffer Cache 被挤出,或小表被反复全扫 -
direct path read排第一 +Physical reads direct同步飙升 → 基本锁定大表全表扫描或并行查询 - Load Profile 一切平稳,但 Top 5 里
enq: TX - row lock contention已占第二 → 说明锁冲突正在拖垮响应,必须立刻查阻塞链,别被“工作量密度”迷惑
最常被跳过的动作,是把 Top 5 里的事件和对应时段的 v$active_session_history(ASH)对齐。AWR 给你总账,ASH 给你流水。比如 log file sync 高发时段,ASH 里如果大量会话堆在 COMMIT 状态,才真正坐实是提交频率问题;如果堆在 PL/SQL execution,那可能只是存储过程里嵌了太多 COMMIT。


















