Minimizing System Contention ( 17- Son Locked Session ları Belirleme )

Son Locked Session ları Belirleme

  - Bir session, büyük olasılıkla başka bir oturum tarafından yerleştirilen blocking lock dan dolayı veritabanında ciddi bekleyişler yaşıyor.
V$LOCK'ı ve diğer viewleri kilitleme konusunu daha derinlemesine incelemek için kullanmaya çalıştınız, ancak kilit meydana gelirken "yakalayamıyorsunuz". Kilitleme devam ederken kaçırmış olabileceğiniz daha eski kilitleme verilerini "görmek" için farklı bir view kullanmak istiyorsunuz.

  - Önceki beş dakika boyunca(zaman aralığını değiştirebilirsiniz) veritabanında tutulan tüm kilitler hakkında bilgi bulmak için ASH'ye dayalı aşağıdaki ifadeyi uygulayabilirsiniz.
 
   SQL> select to_char(h.sample_time, 'HH24:MI:SS') TIME,h.session_id,
    decode(h.session_state, 'WAITING' ,h.event, h.session_state) STATE,
    h.sql_id,
    h.blocking_session BLOCKER
    from v$active_session_history h, dba_users u
    where u.user_id = h.user_id
    and h.sample_time > SYSTIMESTAMP-(5/1440);
 
   TIME  SID  STATE         SQL_ID    BLOCKER
   --------- ---  --------------------------------- -------------- --------
   17:00:52  197  116 enq: TX - row lock contention  094w6n53tnywr  191
   17:00:51  197  116 enq: TX - row lock contention  094w6n53tnywr  191
   17:00:50  197  116 enq: TX - row lock contention  094w6n53tnywr  191

  - ASH, oturum 1, oturum 2, blocked session  (SID = 197) için "bekletme" durumuna neden olan blocking session (SID = 191) yaptığı tüm blokları kaydettiğini görebilirsiniz.

  Nasıl Çalışır:

  - Genellikle, veritabanı kullanıcılarınız bir performans sorunu hakkında şikayet ettiğinde, V$SESSION veya V$LOCK viewlerini sorgulayabilir, ancak orada yararlı bir şey bulamayabilirsiniz, çünkü bekleme sorunu o zamana kadar çözülmüş olabilir.
  Bu koşullar altında, V$ACTIVE_SESSION_HISTORY görünümünü, önceki 60 dakika boyunca veritabanında neyin meydana geldiğini bulmak için sorgulayabilirsiniz. Bu view, Active Session History (ASH) bir pencere sunar; bu, her active session hakkında saniyede bir bilgi toplayan bir hafıza arabelleğidir. V$ACTIVE_SESSION_HISTORY, her active session için bir satır içerir ve ASH dönen bir arabellek olduğundan, yeni bilgiler sürekli olarak eski verilerin üzerine yazılır.

  - Aşağıda bir örnek senaryo mevcut

  SQL> create table test (name varchar(20), id number (4));
  Table created.
  SQL>
 
  SQL> insert into test values ('alapati','9999');
  1 row created.
  SQL> insert into test values ('sam', '1111');
  1 row created.
  SQL> commit;
  Commit complete.

  - Session 1'de (geçerli oturum), TEST tablosundaki SELECT * FOR UPDATE deyimini yürütün; bu tabloya bir lock yerleştirecektir.

  SQL> select * from test for update;

  - Session 2, farklı bir oturumda aşağıdaki UPDATE deyimini çalıştırın:

  SQL> update test set name='Jackson' where id = '9999';

  - Session 2, Session 1 tarafından yayınlanan SELECT FOR UPDATE deyimi tarafından engellendiğinden, şimdi askıda kalacaktır.
  Şimdi devam edin ve Session 1'den bir ROLLBACK veya bir COMMIT işlemi yapın:

  SQL> rollback;
  Rollback complete.

  - ROLLBACK deyimini verdiğinizde, Session 1 şu anda TEST'de tuttuğu tüm kilitleri serbest bırakır. Şimdiye kadar engellenmiş olan Session 2'nin daha önce "hanging" olan UPDATE bildirimini hemen işlediğini fark edeceksiniz.

  - Bu nedenle, veritabanınızda Session 1 ve Session 2 blocked session ile kısa bir süre için bir blocking lock olur. Bununla birlikte, V$LOCK viewında bununla ilgili herhangi bir kanıt bulamazsınız, çünkü bu ve diğer tüm kilitle ilişkili viewler, yalnızca o anki kilitlerle ilgili ayrıntıları gösterir. Active Session History viewlerinin bu noktada öne geçtiği yer: yakınlarda düzenlenen ancak bunları V$LOCK veya V$SESSION viewlerinde bir sorgu ile görüntülemeden önce zaten kaybolmuş olan kilitler hakkında bilgi sağlayabilirler.

  Not: Yukarıdaki bölümde gösterilen Active Session History (ASH) sorgusunu yürütülürken dikkatli olun.
  İlk sütun (SAMPLE_TIME) gösterildiği gibi, ASH her saniye oturum bilgisini kaydeder. Bu sorguyu uzun bir zaman aralığında yürütürseniz, aynı kilitleme bilgilerini tekrar ederek çok fazla miktarda çıktı alabilirsiniz.
  Bu çıktıyı incelemek için, SQL * Plus'da SET PAUSE ON seçeneğini belirtebilirsiniz.
  Bu, her sayfanın çıktısını duraklatarak, sorunu tanımlamak için çıkışın birkaç satırını kaydırmanıza olanak tanır.


  - Bu oturumun son bir saat boyunca beklediği wait eventsi bulmak için aşağıdaki sorguyu kullanın.


  SQL> select sample_time, event, wait_time
   from v$active_session_history
   where session_id = 81
   and session_serial# = 422;

  - SAMPLE_TIME sütunu, belirli bir wait event dan dolayı bu oturumun ne zaman performans sorunu gösterdiğini tam olarak bilmenizi sağlar.
  Burada gösterildiği gibi, V$SQL viewı V$ACTIVE_SESSION_HISTORY viewile birlikte kullanarak, bu oturum tarafından yürütülen gerçek SQL deyimini tanımlayabilirsiniz:

  SQL> select sql_text, application_wait_time
   from v$sql
   where sql_id in ( select sql_id from v$active_session_history
   where sample_time = '08-MAR-11 05.00.52.00 PM'
   and session_id = 68 and session_serial# = 422);


  - Alternatif olarak, V$ACTIVE_SESSION_HISTORY viewında zaten SQL_ID'ye sahipseniz, burada gösterildiği gibi SQL_TEXT sütunundaki değeri V$SQLAREA viewiden elde edebilirsiniz:

  SQL> select sql_text FROM v$sqlarea WHERE sql_id = '7zfmhtu327zm0';

  - SQL_ID öğesine sahip olduğunuzda, bu SQL deyimi için DBMS_XPLAN paketine dayalı aşağıdaki sorguyu çalıştırarak SQL Planı çıkarmak da kolaydır:

  SQL> select * FROM table(dbms_xplan.display_awr('7zfmhtu327zm0'));

  - MMON, AWR snapshot oluşturulduğunda, ASH verilerini her saat diske akıtıyor. MMON ASH verilerini diske attığında ne olur?
 Artık, eski verileri artık V$ACTIVE_SESSION_HISTORY viewile sorgulayamayacaksınız. Merak etmeyin, çünkü eski verileri sorgulamak için DBA_HIST_ACTIVE_SESS_HISTORY viewını kullanmaya devam edebilirsiniz. Bu viewın yapısı V$ACTIVE_SESSION_HISTORY viewının yapısına benzer. DBA_HIST_ACTIVE_SESS_HISTORY viewı, son sistem etkinliğinin in-memory active session history içeriğinin geçmişini gösterir. Hala etkin durumdayken bir oturumun son on bekleme olayını incelemek için V$SESSION_WAIT_HISTORY viewinden sorgulayabilirsiniz. Bu view, son bekleme olayları için her ikisi de yalnızca en yeni bekleme durumunun bekleme bilgilerini gösteren V$SESSION ve V$SESSION_WAIT viewlerinden daha güvenilir bilgiler sunar.
  İşte V$SESSION_WAIT_HISTORY viewini kullanan tipik bir sorgu.
 
  SQL> select sid from v$session_wait_history
  where wait_time = (select max(wait_time) from v$session_wait_history);

  - WAIT_TIME sütununda sıfır olmayan herhangi bir değer, bu oturumun beklediği zamanı temsil eder.
 Son bekleme olayı. Bu sütunun sıfır değeri oturumun bir bekleme olayı için beklediği anlamına gelir.

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...