awr中user i/o等待高八成非磁盘慢,而是sql全表扫描、索引失效、lob写入失控或buffer cache被挤出;需先查physical reads与avg rd(ms)组合,再结合load profile比值、file io stats文件级延迟、wait event histogram毛刺及lob段写入特征精准定位。

AWR里User I/O等待占比高,八成不是磁盘慢,而是SQL反复扫表、索引失效、LOB写入失控或Buffer Cache被挤出——得先查Physical Reads和Avg Rd(ms)的组合关系,再往下挖。
看Load Profile里的Physical Reads和Logical Reads比值
这个比值是判断I/O压力真伪的第一道筛子:
- 比值突然升高(比如从0.05跳到0.3)+ Physical Reads绝对值暴涨 → 真实物理IO增多,接着查File IO Stats里Avg Rd(ms)是否持续>20ms(SAN)或>5ms(SSD)
- 比值稳定甚至下降,但Physical Reads总量翻倍 → Buffer Cache可能被大查询/全表扫描挤出,或者某张小表(如配置表)没建主键,被高频单块读反复刷盘
- Logical Reads每秒超10万但Physical Reads才几百 → 基本排除I/O瓶颈,问题在CPU或锁争用
盯死File IO Stats中单个数据文件的Avg Rd(ms)
AWR默认只给表空间级汇总,掩盖了热点文件。关键要看具体文件的延迟分布:
- 查
dba_hist_filestatxs时必须加NULLIF(f.phyrds, 0),否则除零报错 -
readtim单位是百分之一秒(centiseconds),不是毫秒:算Avg Read Time得用ROUND((f.readtim / NULLIF(f.phyrds, 0)) * 10, 2) - 如果某个
USERS表空间下的数据文件Avg Rd(ms)达18ms且占全库Physical Reads 65%,基本锁定是没走索引的全表扫描;如果是TEMP文件延迟高,先查SQL ordered by Temp Space
别漏掉Wait Event Histogram里的毛刺信号
平均等待时间(Avg Wait ms)会把毛刺拉平,真正致命的是直方图里的长尾:
-
0–1 ms区间占比从75%跌到40% → I/O开始排队,OS或存储队列已饱和 -
16–32 ms和32–64 ms档位计数同步激增超2倍 → LGWR或DBWR写盘被拖住,不是SQL问题 - Wait Event Histogram Detail(4 sec to 2 min)里出现
db file sequential read→ 单次读卡4秒以上,一定是存储链路、HBA队列深度或RAID卡缓存策略出问题,和数据库逻辑无关
LOB段和SecureFiles容易被当成背景噪音
LOB写入引发的I/O等待常藏在后台,不显眼但持续消耗资源:
- 用
SELECT table_name, column_name, securefile FROM dba_lobs WHERE owner = 'YOUR_SCHEMA'确认是否还在用BASICFILE——哪怕建表写了SECUREFILE,若db_securefile参数为NEVER或表空间非ASSM,仍退化为BASICFILE - 查
DBA_HIST_SEG_STAT看LOB段的physical_writes / logical_writes比值:>0.8说明大量直写磁盘,极可能是CACHE未启用或频繁UPDATE重写整个LOB块 - 改BASICFILE为SECUREFILE不能
ALTER TABLE ... MODIFY LOB,必须重建列:导出→新建SECUREFILE列→逐行迁移→重命名
最常被忽略的是:User I/O等待高,往往对应着某个表空间下几个特定数据文件的延迟异常,而不是全库均匀慢。定位不到具体文件,就永远在调参数和换磁盘之间打转。











