enq: HW – contention bekleme olayı
Enqueues, veritabanı kaynaklarına erişimi seri hale getiren paylaşılan bellek yapılarıdır (kilitler). Bir oturum veya işlemle ilişkilendirilebilirler.
HW (high water mark) ise segmentte kullanılan ve kullanılmayan alan arasındaki sınırdır.
AWR raporlarında yüksek oranda “enq: HW – contention” bekleme olayları görüldüğünde sorunun giderilmesi gerekmektedir. Genellikle basicfile şeklinde lob alan içeren tablolara yapılan insert işlemlerinde görülmektedir.
Sorunun giderilmesi için ilgili tablodaki lob alanının basicfile’dan securefile’a dönüştürülmesi gerekmektedir.
Sorun yaşanan nesnelerin tespiti için aşağıdaki yol izlenebilir.
Öncelikle ” enq: HW – contention ” ile ilgili event id’leri tespit ediyoruz.
SQL> SELECT event_id,
name,
parameter1,
parameter2,
parameter3
FROM v$event_name
WHERE name = 'enq: HW - contention';
EVENT_ID NAME PARAMETER PARAMETER PARAMETER3
---------- ---------------------- ------------------- ------------------- -------------------
1645217925 enq: HW - contention name|mode table space # block
Sonrasında dba_hist_active_sess_history görüntüsünden ilgili event id ile ilgili file ve block bilgilerinin tespit için gerekli bilgileri tespit ediyoruz.
SQL> SELECT event,
p1,
p2,
p3,
COUNT (1)
FROM dba_hist_active_sess_history
WHERE event_id = 1645217925
GROUP BY event,
p1,
p2,
p3; 2 3 4 5 6 7 8 9 10 11
EVENT P1 P2 P3 COUNT(1)
---------------------------------------------------------------- ---------- ---------- ---------- ----------
enq: HW - contention 1213661190 25 17761024 1
enq: HW - contention 1213661190 0 4294200 61
enq: HW - contention 1213661190 38 853351013 118356
enq: HW - contention 1213661190 38 373735013 1
Bu bilgiler ile dosya ve blok bilgileri dbms_utility paketi ile tespit edilir. Pakette kullanılan bilgi , yukarıdaki sorgudaki P3 alanındaki bilgidir. Sayıca çok fazla bekleme yaşanan lob segmentin tespiti gerekmektedir.
SQL> SELECT DBMS_UTILITY.Data_block_address_file (853351013) FILE#,
DBMS_UTILITY.Data_block_address_block (853351013) BLOCK#
FROM DUAL; 2 3
FILE# BLOCK#
---------- ----------
203 1907301
Datafile ve blok bilgisi ile buradaki lob segmenti tespit ediyoruz.
SQL> SELECT owner, segment_type, segment_name
2 FROM dba_extents
3 WHERE file_id = 203 AND 1907301 BETWEEN block_id AND block_id + blocks - 1;
OWNER SEGMENT_TYPE SEGMENT_NAME
------------------------------ ------------------ ---------------------------------------------------------------------------------
ADURUOZ LOB PARTITION SYS_LOB0000291772C00006$$
Tespit edilen lob segmentin hangi tabloya ait olduğunu dba_lobs görüntüsünden belirliyoruz.
SQL> SELECT owner,
table_name,
column_name,
chunk,
securefile
FROM dba_lobs
WHERE segment_name = 'SYS_LOB0000291772C00006$$';
OWNER TABLE_NAME COLUMN_NAME CHUNK SEC
---------------- --------------- --------------- --------------- ---------------
ADURUOZ TESTTABLE DOSYA 8192 NO
Yukarıdaki sorgunun çıktısından , ilgili tablo belirlenmiş ve bu tablonun lob alanın securefile olmadığı görülmektedir.
Bu bekleme olayının asıl sebebi , lob alanın basic file olmasıdır. Sorunun giderilmesi için ilgili lob alanı securefile olacak şekilde değiştirilmelidir.