Oracle 数据库 I/O 优化

Oracle 数据库 I/O 优化

适用版本:Oracle Database 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07


1. 概述

I/O 是数据库性能关键[1]:

类型

  • 物理 I/O
  • 逻辑 I/O
  • 顺序 I/O
  • 随机 I/O

详细见:Oracle IO 调优


2. I/O 分析

2.1 文件 I/O

SELECT 
  df.file_name,
  fs.phyrds,
  fs.phywrts,
  fs.avgiotim,
  ROUND((fs.phyrds + fs.phywrts) * 8 / 1024, 2) AS mb
FROM v$filestat fs, dba_data_files df
WHERE fs.file# = df.file_id
ORDER BY phyrds + phywrts DESC;

2.2 等待事件

SELECT 
  event, 
  total_waits, 
  time_waited, 
  average_wait
FROM v$system_event
WHERE event IN (
  'db file sequential read',
  'db file scattered read',
  'db file parallel write',
  'log file parallel write',
  'log file sync'
)
ORDER BY time_waited DESC;

2.3 系统统计

SELECT name, value FROM v$sysstat 
WHERE name LIKE 'physical%' OR name LIKE '%consistent%' OR name LIKE '%db block%';

3. I/O 优化策略

3.1 ASM

-- 多磁盘组
+DATA - 数据
+FRA  - 归档
+REDO - Redo

-- AU 大小
CREATE DISKGROUP data AU SIZE 4M ...;

详细见:Oracle ASM 详解

3.2 表空间分离

-- 不同表空间不同磁盘
CREATE TABLESPACE ts_data DATAFILE '/u01/data/...' SIZE 10G;
CREATE TABLESPACE ts_index DATAFILE '/u02/index/...' SIZE 5G;
CREATE TABLESPACE ts_undo DATAFILE '/u03/undo/...' SIZE 5G;

3.3 Redo 分离

-- Redo 在专用磁盘
ALTER DATABASE ADD LOGFILE GROUP 1 
  ('/redo1/redo01a.log', '/redo2/redo01b.log') SIZE 2G;

4. Buffer Cache 优化

4.1 增大 Buffer

ALTER SYSTEM SET db_cache_size = 16G;

4.2 命中率

SELECT 
  1 - SUM(decode(name, 'physical reads cache', value, 0)) /
      NULLIF(SUM(decode(name, 'consistent gets from cache', value, 0) + 
                 decode(name, 'db block gets from cache', value, 0)), 0)
  AS hit_ratio
FROM v$sysstat
WHERE name IN ('physical reads cache', 'consistent gets from cache', 'db block gets from cache');
-- 目标 > 95%

4.3 KEEP Pool

ALTER SYSTEM SET db_keep_cache_size = 4G;

ALTER TABLE small_hot_table STORAGE (BUFFER_POOL KEEP);

5. SQL 优化

5.1 减少物理读

-- 1. 索引优化
-- 2. 减少 SELECT *
-- 3. 分区

5.2 减少逻辑读

-- 1. 复合索引
-- 2. 索引覆盖
-- 3. SQL 重写

5.3 并行

SELECT /*+ PARALLEL(8) */ * FROM big_table WHERE ...;

详细见:Oracle 高负载 SQL 优化实战


6. 数据文件分布

6.1 均衡

磁盘 1: data01, data04, idx01, idx04
磁盘 2: data02, data05, idx02, idx05
磁盘 3: data03, data06, idx03, idx06

6.2 ASM 自动均衡

ASM Extent 自动分布

7. SSD 应用

7.1 热点数据

-- 热点表空间放 SSD
CREATE TABLESPACE ts_hot DATAFILE '/ssd/data/hot01.dbf' SIZE 100G;

7.2 Redo

Redo 放 SSD 提升写性能

7.3 临时表空间

大排序放 SSD

8. 压缩

8.1 表压缩

-- 减少物理读
ALTER TABLE big_table COMPRESS FOR OLTP;
ALTER TABLE big_table MOVE COMPRESS FOR OLTP;

详细见:Oracle 表压缩技术

8.2 LOB 压缩

ALTER TABLE t MODIFY LOB(data) (COMPRESS HIGH);

9. In-Memory

-- 减少 I/O
ALTER TABLE big_table INMEMORY MEMCOMPRESS FOR QUERY HIGH;

详细见:Oracle 12c In-Memory Column Store


10. 监控

10.1 I/O 等待

SELECT 
  event, 
  total_waits, 
  time_waited
FROM v$system_event
WHERE event LIKE 'db file%'
ORDER BY time_waited DESC;

10.2 IOPS/吞吐

SELECT 
  metric_name, 
  value
FROM v$sysmetric
WHERE metric_name IN ('Physical Read Total IOPS', 'Physical Write Total IOPS',
  'Physical Read Total Bytes Per Sec', 'Physical Write Total Bytes Per Sec');

10.3 OS 监控

iostat -x 1
sar -d 1

11. 常见 I/O 问题

11.1 db file sequential read

原因:索引单块读多
优化:
1. 减少索引扫描
2. 减少回表
3. 复合索引

11.2 db file scattered read

原因:全表扫描
优化:
1. 加索引
2. 分区裁剪
3. 并行

11.3 log file sync

原因:提交等待 LGWR
优化:
1. Redo 在 SSD
2. 减少提交
3. Redo 大小

11.4 write complete waits

原因:DBWn 慢
优化:
1. 增大 DBWn
2. 增大 Buffer Cache
3. 减少脏块

12. 常见坑与排错

12.1 I/O 瓶颈

-- 1. 找热点文件
SELECT * FROM v$filestat ORDER BY phyrds + phywrts DESC;

-- 2. ASM 均衡
-- 3. SSD
-- 4. 分散

12.2 I/O 不均衡

-- 1. ASM
-- 2. 文件分布
-- 3. 热点表

13. 最佳实践

  1. ASM:自动化
  2. 表空间分离:业务
  3. Redo 专用:性能
  4. SSD 热点:快速
  5. Buffer Cache 大:减少 I/O
  6. KEEP Pool:热点
  7. 索引优化:基础
  8. 压缩:减少 I/O
  9. In-Memory:极致
  10. 监控 I/O:性能

14. 参考资料

[1] Oracle Database Performance Tuning Guide 19c, “I/O” https://docs.oracle.com/en/database/oracle/oracle-database/19/tgdba/