為防止多個程序同時修改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;