天天看點

段上的等待事件 —— enq: HW - contention(oracle)

為防止多個程序同時修改HWM而提供的鎖稱為HW鎖。想要移動HWM的程序必須獲得HW鎖。若在擷取HW鎖過程中發生争用,則等待enq: HW - contention事件。HW鎖争用大部分是因大量執行insert所引發的,偶爾也會因大量執行update在復原段中發生HW鎖争用現象。若是update,表中段的擴充的大小雖然不多,但在建立復原資料的過程中,需要復原段的急速擴張。HW鎖争用是在急速空間擴張時普遍出現的等待現象,有時也會引發嚴重的性能下降。

SQL> select event#,name,parameter1,parameter2,parameter3 from v$event_name where name = 'enq: HW - contention';
 
    EVENT# NAME                                     PARAMETER1           PARAMETER2           PARAMETER3
---------- ---------------------------------------- -------------------- -------------------- --------------------
       250 enq: HW - contention                     name|mode            table space #        block
           

衆所周知,Oracle高水位線标志着該線以下的block均被Oracle格式過,通俗一點講就是該高水位線以下的block都被Oracle使用過。 通常在執行insert操作時,當高水位線以下block不夠用時,Oracle将會推進高水位線。更進一步講,當有多個程序在同時進行insert操作時,比較容易引起高水位線争用,主要表現為enq: HW - contention。

如何找到事件:'enq: HW - contention' 熱點對象:

SQL> select p1, p2, p3 from v$session_wait where event = 'enq: HW - contention';  
   
        P1         P2         P3  
---------- ---------- ----------  
1213661190          7  140003563  
1213661190          7  140003563  
1213661190          7  140003563  
1213661190          7  140003563  
1213661190          7  140003563  
1213661190          7  140003563  
1213661190          7  140003563             

通過P3進行DBMS_UTILITY轉換可以獲知發生争用的檔案和block:

SQL> select dbms_utility.data_block_address_block(140003563),dbms_utility.data_block_address_file(140003563) from dual;  
  
DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK(140003563) DBMS_UTILITY.DATA_BLOCK_ADDRESS_FILE(140003563)  
------------------------------------------------ -----------------------------------------------  
                                         1591531                                              33  
           

進而通過file#和block#定位對象:

SQL> select owner, segment_type, segment_name   
  2  from dba_extents   
  3  where file_id = 33   
  4  and 1591531 between block_id and block_id + blocks - 1;