db_block_size参数对lob段读写性能几乎无影响,因lob默认走direct path i/o、绕过buffer cache;真正关键的是lob chunk大小、存储条带对齐及lobindex访问模式。

LOB段不走标准Buffer Cache,Block Size设置基本无效
直接说结论:DB_BLOCK_SIZE 参数对 LOB 段的读写性能几乎没有影响。因为 LOB(尤其是启用了 ENABLE STORAGE IN ROW 以外的场景)默认走直接路径(direct path read/write),绕过 Buffer Cache,也就跳过了数据库块级缓存机制——此时真正起作用的是操作系统 I/O 块大小、存储条带尺寸和 LOB CHUNK 大小。
常见误解是“调大 DB_BLOCK_SIZE 就能提升大对象吞吐”,但 Oracle 的 LOB 段物理存储单位不是数据块,而是由 CHUNK 定义的连续 OS 块集合。哪怕你把 DB_BLOCK_SIZE 改成 16KB,只要 LOB CHUNK 还是默认 8KB,底层文件系统每次仍按 8KB 对齐读写。
-
DB_BLOCK_SIZE只影响表段、索引段等常规段的块内组织,不影响 LOBSEGMENT 的物理布局 - LOB 读写等待事件如
direct path read的耗时,主要取决于存储响应时间(await)、CHUNK与实际访问粒度是否匹配,而非数据库块大小 - 在 AWR 报告中看到高
direct path read等待,查v$sesstat的physical reads direct而非db block gets,后者对 LOB 几乎无意义
真正该调的是 LOB CHUNK 大小,不是 DB_BLOCK_SIZE
CHUNK 是 LOB 段的最小分配/读写单位,它必须是 DB_BLOCK_SIZE 的整数倍,且一旦定义无法修改(除非重建表)。它的值直接影响每次 I/O 的大小、内存拷贝开销和存储碎片率。
- 默认
CHUNK = 8192(即 8KB),适合随机小读写;但若应用常读取 >1MB 的 CLOB/BLOB,每次DBMS_LOB.READ都会触发上百次 8KB 直接读,放大系统调用和存储寻道开销 - 批量写入场景(如上传附件),建议设为
CHUNK = 65536(64KB)或CHUNK = 262144(256KB),可显著降低 I/O 次数和元数据访问频率 - 注意:增大
CHUNK会导致空间浪费——哪怕只存 10KB 数据,也会占用一整个 CHUNK 空间;需结合平均 LOB 大小评估,别盲目设成 1MB - 建表时指定:
lob (orig_file) (chunk 65536);已有表只能通过ALTER TABLE ... MOVE LOB重建,且需停写窗口
配合 CHUNK 调整存储层参数才有效果
单改 CHUNK 不够,必须让下层存储链路对齐。否则出现“应用想一次读 64KB,存储却拆成 8 个 8KB 请求下发”,反而更慢。
- 检查 ASM 条带大小:
SELECT name, allocation_unit_size FROM v$asm_diskgroup;OLTP+LOB 场景建议allocation_unit_size = 128KB或256KB,与 CHUNK 同量级 - 裸设备或文件系统挂载选项:确保使用
noatime,nodiratime,barrier=0(仅限可靠存储),避免元数据更新拖慢大块写入 - 禁用伪均衡条带:如果底层是 RAID 0 或 ASM 且
CHUNK远小于条带大小(如 CHUNK=8KB,条带=1MB),随机读会强制跨盘,放大延迟 - SSD/NVMe 上可忽略传统磁盘寻道问题,但要注意队列深度匹配——
CHUNK过大会导致单次 I/O 占满队列,压测时观察iostat -x的avgqu-sz是否持续 >2
容易被忽略的关键点:LOBINDEX 和 PCTVERSION 的隐性开销
很多人只盯着 LOBSEGMENT,却忘了 LOB 操作必然伴随 LOBINDEX 和版本管理开销。这两者才真正受 DB_BLOCK_SIZE 影响,且极易成为瓶颈。
-
LOBINDEX是 B*Tree 结构,其分支块/叶块都走标准 Buffer Cache,DB_BLOCK_SIZE加大会降低树高度,但前提是索引频繁被访问;若 LOB 访问集中在少数几个大对象,LOBINDEX块可能早已热驻留,收益极小 -
PCTVERSION控制旧版本 LOB 数据保留比例,默认 10%;值过高会导致大量历史 CHUNK 滞留,不仅占空间,还让direct path read在定位最新版本时多扫多个块——建议 OLTP 场景设为PCTVERSION 5或改用RETENTION - RAC 环境下,
LOBINDEX块争用会体现为gc cr block busy,此时调大DB_BLOCK_SIZE反而加剧 GC 流量(单块变大,传输量上升)
真正要优化 LOB IO,得从 CHUNK 定义、存储对齐、LOBINDEX 访问模式三处下手,而不是在 DB_BLOCK_SIZE 上打转。尤其注意:已有业务表的 CHUNK 无法在线调整,误判成本极高。











