先查v$filestat与v$datafile关联的phyrds/phywrts及avgiotim>20ms的热点文件,再用iostat -x 1 5验证%util>70%和await飙升,锁定硬件或队列瓶颈;迁移至独立lun或ssd,分离system、undotbs1与业务表空间,oltp优先raid 10/nvme,临时段与lob另置;禁用伪均衡条带,asm stripe size设为128kb–256kb;显式分配高速temp表空间;避免无索引order by+limit触发磁盘排序;迁移后必须压测验证。
查清哪些数据文件正在拖慢io
别急着调参数或换存储,先确认是不是真有热点。执行以下查询,找出 avgiotim > 20ms 且 phyrds/phywrts 高的前5个文件:
SELECT d.name, f.phyrds, f.phywrts, f.avgiotim, f.maxiowtm FROM v$datafile d, v$filestat f WHERE f.file# = d.file# ORDER BY f.avgiotim DESC, f.phyrds + f.phywrts DESC FETCH FIRST 5 ROWS ONLY;
同时在操作系统层跑 iostat -x 1 5,比对对应设备的 %util 是否持续 > 70%、await 是否突增。如果某文件的 MAXIOWTM 显著高于其他,且对应磁盘 svctm 也高,基本可断定是该盘硬件或队列瓶颈——不是Oracle配置问题,是物理层卡住了。
把表空间迁到独立LUN或SSD,但必须按类型隔离
迁移不是“换个路径”,而是打破共享争用。OLTP系统下,这些组合绝对不能共存于同一RAID 5 LUN:
-
SYSTEM表空间(数据字典频繁读) -
UNDOTBS1(回滚写密集、日志同步强依赖) - 用户业务表空间(随机读写混杂)
正确做法:
- OLTP核心业务表空间 → 单独 RAID 10 LUN 或 NVMe SSD
- 临时表空间(
TEMP)→ 独立高速盘,禁用写缓存(避免排序中断) - LOB 表空间 → 可放 RAID 5,但必须与主业务物理分离
- 归档日志 → 低速盘或网络存储,不参与在线IO竞争
执行迁移时用 ALTER TABLESPACE ... MOVE DATAFILE,目标文件系统需挂载为 noatime,nodiratime,否则元数据更新会干扰真实IO观测。
禁用伪均衡条带,ASM条带大小设为128KB–256KB
很多DBA以为开了ASM或LVM条带就自动负载均衡了,实际常因访问模式失效——尤其OLTP小IO场景下,细粒度条带反而导致单次逻辑IO被拆成多个物理IO,放大延迟。
关键原则:
- 条带深度(stripe depth)应 ≥
DB_BLOCK_SIZE×DB_FILE_MULTIBLOCK_READ_COUNT(默认 8K × 128 = 1MB),但不超过OSmax_io_size - ASM中显式设置
STRIPESIZE:建磁盘组时用ATTRIBUTE 'au_size'='4M', 'stripesize'='256K' - 禁用跨盘软件条带(如LVM striping on top of ASM),这属于冗余抽象,只会增加路径开销
验证是否生效:查 v$asm_diskgroup 的 STRIPESIZE 和 SECTOR_SIZE,确保无冲突。
临时段和排序必须显式绑定高速存储
即使主表空间在SSD上,如果 TEMP 表空间还在老RAID 5上,ORDER BY+LIMIT 或哈希连接仍会触发磁盘排序,直接拉垮响应时间。
操作要点:
- 创建专用高速临时表空间:
CREATE TEMPORARY TABLESPACE temp_fast TEMPFILE '/u02/oradata/.../temp_fast01.dbf' SIZE 2G TABLESPACE GROUP ''; - 禁止使用默认
TEMP表空间,通过ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp_fast切换 - 检查当前排序是否走磁盘:
SELECT name, value FROM v$sysstat WHERE name IN ('sorts (memory)', 'sorts (disk)');,若后者占比 > 5%,说明内存不足或临时表空间IO跟不上
真正容易被忽略的是:迁移后不做压测。哪怕所有配置都改对了,没用真实业务SQL跑满30分钟以上,就无法暴露IO队列堆积或缓存预热不足的问题。











