Minimizing System Contention ( 13- Blocked ve Blocking Sessions'ları Belirleme )

Blocked ve Blocking Sessions'ları Belirleme


  - Oracle veritabanında bir "enqueue wait event"ı gördüğünüzde, bazı oturumların SQL deyimlerini yürütmesini bekleyen locking ihtimali vardır. Bir oturum "enqueue" wait olayında beklerse, bu oturum farklı bir oturum tarafından tutulan locktan dolayı beklemektedir. Engellenen ve engelleyen oturumlarla ilgili bilgileri görüntülemek için aşağıdaki komutu kullanabilirsiniz:
 
 
   SQL> select decode(request,0,'Holder: ','Waiter: ')||sid sess,
     id1, id2, lmode, request, type
     from v$lock
     where (id1, id2, type) in
     (select id1, id2, type from v$lock where request>0)
     order by id1, request;
 
  - V$LOCK viewı, instance da herhangi bir blocking lock olup olmadığını gösterir. Blocking lock varsa, engelleyen oturumları ve engellenen oturumları da gösterir. Blocking sessionın, hepsinin bloke edildiği nesneye ihtiyacı olursa, aynı anda birden fazla oturumu engelleyebileceğini unutmayın.
  Kilitleri gösteren bir örnek:
 
    SQL> select sid,type,lmode,request,ctime,block from v$lock;
     SID TY  LMODE REQUEST  CTIME  BLOCK
    ----- ---- ------ -------- ------  ------
     127  MR    4   0   102870   0
     81  TX    0   6   778    0
     191  AE    4   0   758    0
     205  AE    4   0   579    0
     140  AE    4   0   11655    0
     68  TM    3   0   826    0
     68  TX    6   0   826    1
   
  - İlk bakmamız gereken sütun BLOCK sütunudur - blocking session bu sütun için 1 değerine sahip olacaktır.
  Örneğimizde, oturum 68 blocking sessiondır, çünkü BLOCK sütununun altında 1 değeri gösterilmektedir.
  Böylece, V$LOCK viewı bu tarife yukarıdaki bölümündeki ilk bulguyu teyit eder. SID si 68 olan blocking sessionı  ayrıca LMODE sütununda, bu kilidi exclusive mode tuttuğunu gösteren bir lock modu "6" gösterir - 81 oturumu "hanging",  güncelleme işlemini gerçekleştirememektedir. Elbette blocked session kurbanı olduğu için BLOCK sütununda 0 değeri  gösterilir. Ayrıca, sütun güncelleme gerçekleştirmek için exclusive mode da bir kilitleme isteği nedeniyle, REQUEST sütununun altında 6 değeri gösterilmektedir. Blocking session REQUEST sütununda 0 değerini göreceksiniz çünkü herhangi bir kilit istemiyor - zaten tutuyor:)
 
  - Wait class ı öğrenmek ve bir blocking session ın diğerlerini ne kadar engellediğini öğrenmek isterseniz, burada gösterildiği gibi V$SESSION viewını sorgulayarak bulabilirsiniz:
 
  SQL> select blocking_session, sid, wait_class,
    seconds_in_wait
    from v$session
    where blocking_session is not NULL
    order by blocking_session;
  
   BLOCKING_SESSION SID  WAIT_CLASS  SECONDS_IN_WAIT
   ----------------- -------- ------------- ----------------
    68     81  Application   7069
 
 
   SID si 68 olan oturum , SID si 81 olan oturumu engellediğini ve bloğun 7069 saniye önce başlatıldığını gösterir.
  
  Nasıl Çalışır:
 
  - Bir Oracle veritabanında göreceğiniz "enqueue lock" ların en yaygın türleri şunlardır:
 
   TX: Bunlar bir  transaction locktır ve genellikle hatalı uygulama mantığından kaynaklanır.
  • TM: Bunlar tablo düzeyi DML kilitlemeleridir ve en yaygın nedeni, child tabloda foreign keyleri indexlememenizdir.
 
  - Buna ek olarak, duruma göre "ST enqueue lock" larıda görme ihtimaliniz var. Bu, Oracle'ın disk yönetimi işlemleri yaparken beklediği oturumları belirtir; örneğin, bir sort işlemi gerçekleştirmek için temporary segment tahsisi.

 

Constraint Disable-Enable

Disable Constraint BEGIN   FOR c IN   (SELECT c.owner, c.table_name, c.constraint_name    FROM user_constraints c, user_tables t    WHERE...