天天看點

等待事件enq:HW–contention說明及解決方法

一、今天在檢視awr報告中,發現Top 5 Timed Foreground Events發現enq: HW - contention的等待事件;

二、enq: HW - contention的官方說明:

The HW enqueue is used to serialize the allocation of space beyond the high water mark of a segment.

?V$SESSION_WAIT.P2 / V$LOCK.ID1 is the tablespace number.

?V$SESSION_WAIT.P3 / V$LOCK.ID2 is the relative data block address (dba) of segment header of the object for which space is being allocated.

If this is a point of contention for an object, then manual allocation of extents solves the problem.

三、等待事件解釋

為防止多個程序同時修改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' 熱點對象:

1、檢視v$session_wait,應該會有如下等待事件:

SQL> select p1, p2, p3 from v$session_wait where event = 'enq: HW - contention';

P1 P2 P3

---------- ---------- ----------

1213661190 7 140003563

2、通過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

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

SQL> select owner, segment_type, segment_name

from dba_extents

where file_id = 33 and 1591531 between block_id and block_id + blocks - 1;

五、減少HW鎖争用的方法如下:

腳本:alter table allocate extent,提前配置設定空間;

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

本文作者:JOHN

ORACLE技術部落格:ORACLE 獵人筆記               資料庫技術群:367875324 (請備注ORACLE管理 )