1. 描述
    Lock used to broker the high water mark during parallel inserts
  2. 参数
    1. P1 name|mode
      name是锁的名称,使用ASCII码表示:“HW” = 0x4857
      mode是锁的类型,
          4 = Shared mode TX wait
          6 = eXclusive mode TX wait
      例如: P1RAW = 48570006  ,表示 eXclusive mode HW wait
    2. P2 tablespace#
      希望获得HW锁的表空间id号
    3. 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) ;
  3. 查找当前该事件的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;
  4. 说明
    HW征用表示在高水位线之上分配空间的操作。如果并发插入一个对象大量的数据,那么多个进程就会在同一时间尝试在高水位线之上分配空间,导致争用。

    关键解决点在于找出哪个segements导致了HW争用,然后分析为什么。

    如果看到这种争用发生,那么需要去查找当前是谁持有这个锁,它正在等待什么。

    同时分析为什么有不同的操作并发的进行这个相同操作,是否在应用层面有办法来避免这种情况。使用这些信息来确定潜在的争用区域并找出原因。

  • No labels