為防止多個進程同時修改HWM而提供的鎖稱為HW鎖。想要移動HWM的進程必須獲得HW鎖。若在擷取HW鎖過程中發生爭用,則等待enq: HW - contention事件。HW鎖爭用大部分是大量執行insert所引發的。
眾所周知,Oracle高水位線標誌著該線以下的block均被Oracle格式過,通俗一點講就是該高水位線以下的block都被Oracle使用過。 通常在執行insert操作時,當高水位線以下block不夠用時,Oracle將會推進高水位線。更進一步講,當有多個進程在同時進行insert操作時,比較容易引起高水位線爭用,主要表現為enq: HW - contention。
- 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
如何找到事件:'enq: HW - contention' 熱點對象:
查看v$session_wait,應該會有如下等待事件:
- 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
-
- 7 rows selected
7 rows selected
通過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;