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. 最佳实践
- I/O 分散:不同磁盘
- Redo 独立:性能
- 索引分离:表空间
- 分区大表:I/O 平衡
- 多块读:参数
- KEEP 池:热表
- 直接/异步 I/O:性能
- SSD 热点:加速
- 监控 I/O:瓶颈定位
- 定期优化:持续
14. 参考资料
[1] Oracle Database Performance Tuning Guide 19c, “I/O” https://docs.oracle.com/en/database/oracle/oracle-database/19/tgdba/i-o.html