快速定位争用的LOB段需从v$session_wait取P3(RDBA),用DBMS_UTILITY解析文件号和块号,查dba_extents得SEGMENT_TYPE='LOBSEGMENT',再通过dba_lobs反查归属表及字段。
怎么快速定位争用的是哪个LOB段
看到 enq: hw - contention,别急着调参数或加索引——90% 以上是 lob 段(sys_lobxxxx$$)在抢高水位线。关键不是看 sql 里写的表名,而是从等待会话的 p3 值反查真实段:
- 从
v$session_wait或v$active_session_history取出P3(即 RDBA) - 用
DBMS_UTILITY.DATA_BLOCK_ADDRESS_FILE和DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK解析出文件号和块号 - 查
dba_extents:条件必须是&block_id BETWEEN block_id AND block_id + blocks - 1,不能只用= block_id - 若查到的
SEGMENT_TYPE = 'LOBSEGMENT',再用dba_lobs反查归属:SELECT OWNER, TABLE_NAME, COLUMN_NAME FROM DBA_LOBS WHERE SEGMENT_NAME = 'SYS_LOB0000234080C00004$$';
注意:如果表空间是 bigfile,DBMS_UTILITY.DATA_BLOCK_ADDRESS_FILE 会返回错误文件号,应改用 DBMS_UTILITY.BLOCK_NUMBER 配合 DBA_DATA_FILES 手动比对。
为什么对基表执行 ALLOCATE EXTENT 没用
对表(如 CPOE_ORD_CA_SYSTEM_REL)执行 ALTER TABLE ... ALLOCATE EXTENT 完全不影响其 CLOB/BLOB 字段——LOB 数据和元数据是分离存储的,各自有独立段、独立 HWM、独立 extent 分配逻辑。
- 常见误操作:
ALTER TABLE t1 ALLOCATE EXTENT→ 实际不缓解任何 LOB 插入争用 - 正确操作对象是 LOB 段本身,语法为:
ALTER TABLE <table_name> MODIFY LOB (<column_name>) (ALLOCATE EXTENT (SIZE 1G));
- 分配 size 过小(如默认 64KB)而业务单次插入几百 MB 的 LOB,仍会触发多次自动扩展争用
- 先查该 LOB 段当前最大 extent:
SELECT MAX(BYTES) FROM DBA_EXTENTS WHERE SEGMENT_NAME = 'SYS_LOB0000234080C00004$$';
建议分配 ≥ 当前最大值,至少 1GB 起
分区为什么比调 SGA 更有效
HW 锁是按 segment 粒度串行化的,一个段 = 一把 HW 锁;分区把一个大段拆成多个物理段,天然分流 HWM 推进请求。
- 对高并发 INSERT 场景,
CREATE TABLE t PARTITION BY HASH(id) PARTITIONS 8可降低 HW 锁争用 70%+,前提是分区键能均匀分布写入 - LOB 字段必须随表一起分区——单独对 LOB 列建索引、改
STORAGE参数或加CHUNK大小都无效 - Oracle 12c 支持在线重定义(
DBMS_REDEFINITION)做不停机分区,但要求表有主键或唯一约束,且不能存在未完成的物化视图日志 - RAC 环境下,单节点预分配 extent 无法消除全局 HW 锁争用,而分区是跨实例有效的分散方案
allocate extent 是临时缓解还是根治
它只是绕过自动扩展时的锁排队,并不改变并发写入模式,也不整理碎片,更不解决段头(L3 位图块)热点问题。
- 预分配后,新插入仍走原路径,只是暂时不用推 HWM;一旦预分配空间耗尽,争用立刻重现
- 不释放已有碎片,
DBA_EXTENTS中零散小 extent 依然存在,IO 效率可能持续偏低 - 在 ASSM 表空间中,即使预分配了大 extent,段头位图块(尤其是 L3)仍是并发修改热点,尤其当插入速率极高时
- 真正根治要组合动作:分区 + 合理 CHUNK 大小(LOB) + 关闭无用审计(如
sys.aud$写入) + 避免/*+ APPEND */在高并发 OLTP 场景滥用
最易被忽略的一点:很多人查到 LOB 段后直接执行 ALLOCATE EXTENT,却没确认该段是否属于 UNDO 表空间(P2 = 1 且表空间为 UNDO),那种情况实际是回滚段在频繁扩展,得调 UNDO_RETENTION 或增大 undo 表空间,而不是动业务表。


















