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. 最佳实践
- ASM:自动化
- 表空间分离:业务
- Redo 专用:性能
- SSD 热点:快速
- Buffer Cache 大:减少 I/O
- KEEP Pool:热点
- 索引优化:基础
- 压缩:减少 I/O
- In-Memory:极致
- 监控 I/O:性能
14. 参考资料
[1] Oracle Database Performance Tuning Guide 19c, “I/O” https://docs.oracle.com/en/database/oracle/oracle-database/19/tgdba/