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.