<p>Oracle 11g中enq: HW - contention争用90%以上源于LOB段高并发插入导致HWM频繁推进;必须通过P3解析定位具体LOB段(如SYS_LOB...$$),再查DBA_LOBS反推表与字段,手工对LOB段执行ALLOCATE EXTENT(如ALTER TABLE t MODIFY LOB(c) (ALLOCATE EXTENT(SIZE 2G)))才有效,直接对基表扩展无效。</p>
直接结论: oracle 11g 中出现 enq: hw - contention,90% 以上是 lob 段(尤其是含 clob/blob 的表)在高并发插入时频繁推进高水位线(hwm)导致的锁争用;手工扩展空间(allocate extent)是最快速有效的缓解手段,但必须对准 lob 段本身操作,而非基表。
怎么定位到具体是哪个 LOB 段在争用
不能只看 SQL 里的表名,enq: HW - contention 的争用对象永远是底层 LOB 段(如 SYS_LOB0000234080C00004$$),不是你写的表名。关键步骤如下:
- 从
v$session_wait拿到等待的P3值(即 RDBA) - 用
DBMS_UTILITY.DATA_BLOCK_ADDRESS_FILE和DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK解析出文件号和块号 - 查
dba_extents定位该块属于哪个SEGMENT_NAME - 再用
dba_lobs反查这个 LOB 段属于哪张表、哪个字段: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 不会影响其 LOB 字段的存储段 —— LOB 数据和元数据是分离存储的,各自有独立的段和 HWM。常见错误包括:
- 误以为
ALTER TABLE t1 ALLOCATE EXTENT能缓解 CLOB 插入争用 → 实际毫无作用 - 没查
dba_lobs就对错段执行扩展,浪费时间且不解决问题 - 分配 size 过小(如默认 64KB),而业务单次插入 LOB 达几百 MB,仍会触发多次扩展争用
正确做法是:先查该 LOB 段当前最大 extent 大小:
SELECT MAX(BYTES) FROM DBA_EXTENTS WHERE SEGMENT_NAME = 'SYS_LOB0000234080C00004$$';然后按此大小或更大(建议 ≥1GB)执行扩展。
如何安全执行手工扩展(11g 兼容写法)
Oracle 11g 支持直接对 LOB 字段指定扩展,语法稳定且无需重启:
- 确认目标表、字段、OWNER 后,执行:
ALTER TABLE CPOE_ORD_CA_SYSTEM_REL MODIFY LOB (STAMP) (ALLOCATE EXTENT (SIZE 2G));
- 若报错
ORA-22864: cannot alter or drop securefile LOB,说明是 SecureFile LOB,需加RETENTION子句或改用SHRINK SPACE(但 SHRINK 不解决写入争用) - 扩展后立即生效,无需 offline 表;但要注意:扩展操作本身会短暂持有 HW 锁,避开业务高峰执行
- 验证是否成功:查
dba_extents是否新增了对应大小的 extent,且SEGMENT_NAME匹配
注意:一次扩展 10G 并非越大越好 —— 过大会浪费空间,且可能加剧后续 I/O 延迟;推荐按最近 1–2 小时实际插入 LOB 总量的 1.5 倍预估。
容易被忽略的长期隐患
手工扩展只是“止痛”,不是根治。真正容易被跳过的点是:
- 没检查表空间是否启用了
AUTOEXTEND且MAXSIZE是否过小,导致反复触发自动扩展争用 - 未评估 LOB 存储策略:
ENABLE STORAGE IN ROW对小 LOB( - 分区表未按时间/业务维度分区 LOB,所有插入挤在同一个 LOB 段上 —— 分区 LOB 是更彻底的方案,但 11g 需手动管理分区级 LOB 属性
- 应用层未做批量插入控制,单条 INSERT 带巨大 CLOB,比批量 100 条小 CLOB 更易触发争用
最常被漏掉的一点:扩展完不监控后续 AWR 报告中 enq: HW - contention 的等待次数是否真下降 —— 有时问题已转移到另一个未被发现的 LOB 段上。


















