- 描述
Lock used to broker the high water mark during parallel inserts - 参数
- P1 name|mode
name是锁的名称,使用ASCII码表示:“HW” = 0x4857
mode是锁的类型,
4 = Shared mode TX wait
6 = eXclusive mode TX wait
例如: P1RAW = 48570006 ,表示 eXclusive mode HW wait - P2 tablespace#
希望获得HW锁的表空间id号 P3 block
如果表空间是BIGFILE类型的,这个block值表示表空间的文件
如果表空间不是BIGFILE类型的,这个是RDBA形式的值。RDBA是相关的file#和block#编码后的值。
使用如下sql将此值转换为真正的file#和block#SELECT DBMS_UTILITY.DATA_BLOCK_ADDRESS_FILE(rdba) RELFILE#, DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK(rdba) BLOCK# FROM (select &P3 rdba from dual) ;
- P1 name|mode
查找当前该事件的blockers
SELECT distinct w.HW, w.p2 OBJECT_ID, l.inst_id, l.sid, l.lmode, l.request FROM ( SELECT p2, p3, 'HW-'||substr(p2raw,-8)||'-'||lpad(p3,8,'0') HW FROM v$session_wait WHERE event='enq: HW - contention' and state='WAITING' ) W, gv$lock L WHERE l.type(+)='HW' and l.id1(+)=w.p2 and l.id2(+)=w.p3 ORDER BY hw, lmode desc, request desc;
说明
HW征用表示在高水位线之上分配空间的操作。如果并发插入一个对象大量的数据,那么多个进程就会在同一时间尝试在高水位线之上分配空间,导致争用。关键解决点在于找出哪个segements导致了HW争用,然后分析为什么。
如果看到这种争用发生,那么需要去查找当前是谁持有这个锁,它正在等待什么。
同时分析为什么有不同的操作并发的进行这个相同操作,是否在应用层面有办法来避免这种情况。使用这些信息来确定潜在的争用区域并找出原因。