physical reads/sec 与 db file scattered read 共同判断多块读负载:前者是宏观io速率,后者是行为模式;占比高且physical reads/sec同步上升(ssd>500/机械盘>150)表明真实多块读压力大,否则可能为小范围扫描或噪声。

怎么看 Physical Reads/sec 和 db file scattered read 的关系
AWR 报告里没有直接叫“多块读吞吐量”的指标,但 Physical Reads/sec(每秒物理读)和等待事件 db file scattered read 共同构成判断依据。前者是 IO 速率的宏观统计,后者是触发该 IO 的典型行为模式——它几乎专指全表扫描、索引快速全扫描这类一次读多个数据块的操作。
常见错误现象:只盯着 db file scattered read 等待时间占比高,就断定“多块读太多”,却忽略 Physical Reads/sec 实际值是否异常。比如在 SSD 环境下,Physical Reads/sec 持续 >500 才算压力明显;传统机械盘则 >150 就需警惕。
- 若
db file scattered read占比高 +Physical Reads/sec同步显著上升 → 多块读真实负载高,可能有未走索引的大表扫描 - 若
db file scattered read占比高但Physical Reads/sec很低 → 可能是小范围扫描(如小表全扫)或采样噪声,不构成吞吐瓶颈 - 若
Physical Reads/sec高但db file scattered read占比不高 → 要查db file sequential read或其它 IO 类等待,可能是大量单块随机读(如索引深度过大)
IO Stats by Function 里的 Write Clusters/sec 为什么不能用来反推多块读
Write Clusters/sec 是 AWR 中 “IO Stats by Function” 部分的指标,反映的是 DBWR 写脏块时每次写入的块数均值。它和多块读无关,属于写路径指标。误用它来评估读吞吐,会导致方向性错误。
容易踩的坑:有人看到 Write Clusters/sec 值偏低(比如平均 2–3 块),就推测“DBWR 写得零碎,所以读也零碎”,这是混淆了读写路径机制。读吞吐看的是 Physical Reads 和对应等待事件,写吞吐看的是 Physical Writes、Write Requests/sec 和 checkpoint 活动。
-
Write Clusters/sec异常低 +log file sync等待高 → 日志写入慢拖累 checkpoint,不是读的问题 -
Write Clusters/sec异常高(如 >64)+DBWR checkpoints频繁 → 可能fast_start_mttr_target设得太小,DBWR 被迫高频刷脏
Buffer Hit Ratio 低于 90% 时,多块读吞吐是否一定有问题
不一定。Buffer Hit Ratio 是缓存命中率,它下降说明更多请求落到磁盘,但不区分读类型。OLAP 类查询天然需要大量多块读,即使 Buffer Hit Ratio 只有 70%,只要 Physical Reads/sec 在硬件承受范围内,就是合理行为。
关键看场景:如果是 OLTP 系统(比如交易下单、账户查询),Buffer Hit Ratio db file scattered read 显著上升,才说明有非预期的全表扫描在冲击缓存,挤出热点数据,导致后续逻辑读变物理读,形成恶性循环。
- 确认系统类型:OLTP 还是 OLAP?AWR 报告头部的
DB Name和业务时段(如报表跑批 vs 白天交易)可辅助判断 - 交叉验证:看
Logical reads是否同步大幅增加 —— 若逻辑读没涨,但物理读涨了,说明是缓存失效而非 SQL 变多 - 检查
DB Block Gets和Consistent Gets比例:OLTP 中前者应远高于后者;若后者突增,可能大量查询走了全表扫描
为什么不能只依赖单个 AWR 快照分析多块读趋势
AWR 快照默认每小时采集一次,而多块读密集操作(如夜间批量导入、定时报表)往往集中在几分钟内爆发。单个快照只能给出这一小时的平均值,会把峰值“抹平”。比如某 SQL 在 2:05–2:08 跑了 3 次全表扫描,每次读 50,000 块,其余 57 分钟完全空闲 —— AWR 显示的 Physical Reads/sec 可能只有 15,毫无警示性。
真正要定位多块读吞吐问题,必须结合 v$active_session_history(ASH)查具体时段的活跃会话堆栈。AWR 是“体检报告”,ASH 才是“心电图”。
- 先用 AWR 锁定可疑时间段(如
db file scattered read占比突增的快照) - 再执行类似查询:
SELECT sql_id, event, COUNT(*) FROM v$active_session_history WHERE sample_time BETWEEN TIMESTAMP '2026-07-20 02:05:00' AND TIMESTAMP '2026-07-20 02:08:00' AND event = 'db file scattered read' GROUP BY sql_id, event ORDER BY COUNT(*) DESC; - 拿到高频
sql_id后,用DBMS_XPLAN.DISPLAY_AWR查它的历史执行计划,确认是否真的走了全表扫描











