cursor: mutex S bekleme olayına sebep olan sorgular

29 Mar by Ahmet Duruöz

cursor: mutex S bekleme olayına sebep olan sorgular

Bir oturum, paylaşılan modda bir mutex’i talep ettiğinde, başka bir oturum bu mutex’i aynı cursor nesnesinde özel modda tuttuğunda, Cursor Mutex S bekleme olayına sebep olur. Diğer bir deyişle Cursor Mutex S bekleme olayı oluştuğunda farklı iki session aynı sorgu üzerinde hard yada soft parsing yapmaya çalışmaktadır.

Bunun sonucu olarak shared pool içerinde yüksek sayıda sorgu versiyonları görmek veya yüksek cpu kullanımı görmek mümkündür.

Sorgular tespit edilip, bind variable kullanılacak şekilde değiştirilmesi veya shared pool içerisinden temizlenmesi gerekmektedir.

Bu bekleme olayına sebep olan sorguların tespiti için v$mutex_sleep_history görüntüsünden MUTEX_IDENTIFIER bilgileri ile v$sqlarea görüntüsünden detaylarına ulaşabiliriz.

Öncelikle  sorguların mutex_identifier bilgilerini bulalım. Aşağıdaki sorgu ile bu bilgilere ulaşabilirsiniz.

SQL>   SELECT MUTEX_IDENTIFIER,
         MUTEX_TYPE,
         MAX (gets),
         MAX (sleeps),
         mutex_value
    FROM v$mutex_sleep_history
   WHERE mutex_type = 'Cursor Pin'
GROUP BY MUTEX_IDENTIFIER, MUTEX_TYPE, mutex_value
ORDER BY 4 DESC; 

MUTEX_IDENTIFIER MUTEX_TYPE	   MAX(GETS) MAX(SLEEPS) MUTEX_VALUE
---------------- --------------------------------------------------------
      3220332543 Cursor Pin	  1722384420	  813613 0000000000000001
      3220332543 Cursor Pin	  1721330975	  569746 0000000000000006
      3220332543 Cursor Pin	  2961274030	  487219 0000000000000015
      3220332543 Cursor Pin	  2961169907	  470463 0000000000000010
      3220332543 Cursor Pin	  1707265921	  465149 000005F50000001C
      3220332543 Cursor Pin	  2961284466	  460056 0000000000000013
      3220332543 Cursor Pin	  1709020847	  450800 000001880000000D

Bu sorgudan dönen MUTEX_IDENTIFIER bilgisi ile v$sqlarea görüntüsündeki hash_value alanı birleştirerek ilgili sorguya ulaşabilirsiniz.

 

SQL> select sql_id, sql_text, version_count,address,hash_value from v$sqlarea where hash_value=3220332543;

Yukarıdaki sorgu ile address ve hash_value bilgileri tespit edilen sorgunun shared pool’dan çıkarılması için aşağıdaki komutu kullanabilirsiniz.

SQL> exec DBMS_SHARED_POOL.PURGE ('000000069387B220, 3220332543', 'C');

PL/SQL procedure successfully completed.

 

Loading

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir