Oracle I/O 调优

Oracle I/O 调优

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


1. 概述

I/O 是 Oracle 性能瓶颈之一[1]:

关键指标

  • IOPS
  • 吞吐量
  • 延迟

2. I/O 等待事件

2.1 关键事件

db file sequential read    -- 单块读(索引)
db file scattered read     -- 多块读(全表)
db file parallel read      -- 并行读
direct path read           -- 直接路径
log file parallel write    -- Redo 写
log file sync              -- 提交同步

2.2 查看等待

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

3. 数据文件 I/O

3.1 查看

SELECT 
  file_name,
  phyrds AS reads,
  phywrts AS writes,
  phyblkrd AS blk_reads,
  phyblkwrt AS blk_writes,
  readtim,
  writetim
FROM v$filestat fs, dba_data_files df
WHERE fs.file# = df.file_id
ORDER BY phyrds + phywrts DESC;

3.2 I/O 热点

-- 热点数据文件
SELECT 
  df.file_name,
  fs.phyrds + fs.phywrts AS total_io
FROM v$filestat fs, dba_data_files df
WHERE fs.file# = df.file_id
ORDER BY total_io DESC
FETCH FIRST 10 ROWS ONLY;

4. 磁盘 I/O 优化

4.1 数据分散

-- 不同表空间不同磁盘
CREATE TABLESPACE users DATAFILE '/disk1/users01.dbf' SIZE 1G;
CREATE TABLESPACE indx DATAFILE '/disk2/indx01.dbf' SIZE 1G;
CREATE TABLESPACE undo DATAFILE '/disk3/undo01.dbf' SIZE 1G;

4.2 分离关键文件

  • 数据文件
  • Redo 日志
  • 归档日志
  • 控制文件

4.3 ASM

-- ASM 自动条带化
CREATE DISKGROUP data NORMAL REDUNDANCY
  FAILGROUP fg1 DISK '/dev/sdb1'
  FAILGROUP fg2 DISK '/dev/sdc1';

5. 全表扫描优化

5.1 减少

-- 1. 加索引
CREATE INDEX idx_emp_dept ON employees(dept_id);

-- 2. 优化 SQL
SELECT id, name FROM employees WHERE dept_id = 10;
-- 不要 SELECT *

5.2 多块读

ALTER SYSTEM SET db_file_multiblock_read_count = 16;

5.3 缓存

-- KEEP 池
ALTER TABLE small_lookup STORAGE (BUFFER_POOL KEEP);

6. Redo 日志优化

6.1 I/O 分离

-- Redo 单独磁盘
ALTER DATABASE ADD LOGFILE GROUP 4 ('/redo_disk/redo04.log') SIZE 1G;

6.2 大小调整

-- 查看切换间隔
SELECT 
  group#, 
  bytes/1024/1024 AS mb,
  members,
  status
FROM v$log;

-- 目标:每 15-30 分钟切换一次

6.3 多组

-- 至少 3 组
ALTER DATABASE ADD LOGFILE GROUP 5 ('/redo_disk/redo05.log') SIZE 1G;
ALTER DATABASE ADD LOGFILE GROUP 6 ('/redo_disk/redo06.log') SIZE 1G;

7. 归档日志优化

7.1 FRA

ALTER SYSTEM SET db_recovery_file_dest = '+FRA' SCOPE=BOTH;
ALTER SYSTEM SET db_recovery_file_dest_size = 100G SCOPE=BOTH;

7.2 多路径

ALTER SYSTEM SET log_archive_dest_1 = 'location=/arch1' SCOPE=BOTH;
ALTER SYSTEM SET log_archive_dest_2 = 'location=/arch2' SCOPE=BOTH;

8. 排序与临时表空间

8.1 临时文件 I/O

SELECT 
  file_name,
  bytes/1024/1024 AS mb
FROM dba_temp_files;

8.2 排序优化

-- PGA
ALTER SYSTEM SET pga_aggregate_target = 4G;

-- 临时表空间
CREATE TEMPORARY TABLESPACE temp 
  TEMPFILE '/disk4/temp01.dbf' SIZE 10G;

9. 表空间 I/O

9.1 不同表空间分离

  • SYSTEM:系统
  • SYSAUX:辅助
  • USERS:用户数据
  • INDX:索引
  • UNDO:回滚
  • TEMP:临时

9.2 大表分区

-- 分区到不同表空间
CREATE TABLE sales (...)
PARTITION BY RANGE (sale_date) (
  PARTITION p2025 VALUES LESS THAN (...) TABLESPACE ts_2025,
  PARTITION p2026 VALUES LESS THAN (...) TABLESPACE ts_2026
);

10. I/O 优化技术

10.1 直接 I/O

-- FILESYSTEMIO_OPTIONS
ALTER SYSTEM SET filesystemio_options = DIRECTIO SCOPE=SPFILE;
-- NONE/ASYNCH/DIRECTIO/SETALL

10.2 异步 I/O

ALTER SYSTEM SET filesystemio_options = SETALL SCOPE=SPFILE;

10.3 SSD

  • Redo 日志:SSD
  • 热点表:SSD
  • 临时表空间:SSD

11. 监控

11.1 I/O 统计

-- AWR
SELECT * FROM dba_hist_filestatxs
WHERE snap_id BETWEEN 100 AND 110;

11.2 OS 层

# iostat
iostat -x 1

# iotop
iotop

12. 常见坑与排错

12.1 I/O 等待高

-- 1. 查看热点文件
-- 2. 分散 I/O
-- 3. 优化 SQL
-- 4. 增加内存

12.2 Redo 切换频繁

-- 1. 增大 Redo
ALTER DATABASE ADD LOGFILE GROUP 7 SIZE 2G;
-- 2. 减少 DML 批量

12.3 全表扫描多

-- 1. 加索引
-- 2. 优化 SQL
-- 3. 收集统计信息

13. 最佳实践

  1. I/O 分散:不同磁盘
  2. Redo 独立:性能
  3. 索引分离:表空间
  4. 分区大表:I/O 平衡
  5. 多块读:参数
  6. KEEP 池:热表
  7. 直接/异步 I/O:性能
  8. SSD 热点:加速
  9. 监控 I/O:瓶颈定位
  10. 定期优化:持续

14. 参考资料

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