Pages

12 Mart 2012 Pazartesi

Veritabanındaki en son bekleme olaylarının analizi

Oracle 11g veritabanında en son bekleme olaylarını gerek kullanıcılar, gerek SQL komutları ve gerekse objeler bazında gözlemlemek ve analiz etmek için V$ACTIVE_SESSION_HISTORY görünümü kullanılabilir. Bu sistem görünümü ile veritabanında oturumların en son bekleme olayları ile ilgili istatistik bilgilerine erişilebilmektedir.  Bu görünümün V$SESSION ve DBA_USERS gibi sistem görünümü ve tabloları ile birleşimi sonucu elde edilen ve faydalı olacağına inandığım bazı analiz sorguları aşağıda yer almaktadır;

Son 15 dakika içindeki en önemli bekleme olaylarının tespit edilmesi;

select event,
sum(wait_time + time_waited) total_wait_time
from v$active_session_history
where sample_time between sysdate – 30/2880 and sysdate
group by event order by total_wait_time desc;

Son 15 dakika içinde hangi kullanıcıların en çok bekleme olayına sebebiyet verdiğinini tespit edilmesi;

select s.sid, s.username,
sum(a.wait_time + a.time_waited) total_wait_time
from v$active_session_history a,
v$session s
where a.sample_time between sysdate – 30/2880 and sysdate
and a.session_id=s.sid
group by s.sid, s.username
order by total_wait_time desc;

Son 15 dakika içinde en fazla bekleme olayına sebebiyet veren SQL komutlarının tespit edilmesi;

select a.user_id,u.username,s.sql_text,
sum(a.wait_time + a.time_waited) total_wait_time
from v$active_session_history a,
v$sqlarea s, dba_users u
where a.sample_time between sysdate – 30/2880 and sysdate
and a.sql_id = s.sql_id
and a.user_id = u.user_id
group by a.user_id,s.sql_text, u.username;

3 yorum:

  1. İyi günler hocam ,
    Ben V$ACTIVE_SESSION_HISTORY viewini son 10 dakika da sessionların cpu da ne kadar ,yer tuttuğunu costunu ,io miktarını bulmak istiyorum.ancak bu view ile sql_planı ilişkilendirmek istediğimde sorgu sonucu istediğim değeri sanki getirmiyor.Aşağıdaki sorgu ile active bir sessionı istiyorum.Bu sorgunun doğruluğundan da emin değilim.

    SELECT DISTINCT SP.SQL_ID, MAX(SP.COST), MAX(SP.CPU_COST), MAX(SP.IO_COST)
    FROM V$SQL_PLAN SP, V$SESSION SE
    WHERE SE.TERMINAL LIKE '%ESINK%'
    AND SP.SQL_ID = SE.SQL_ID
    GROUP BY SP.SQL_ID

    Bu sorguya v$active_session_history viewini ekleyerek son 10 dakikayı incelemek istiyorum.Deneme amaçlı bir sorgu çalıştırınca.O sorguyu son 10 dakikalık sorguda göremiyorum.Yardımcı olabilir misiniz?
    Teşekkür ederiim.

    YanıtlaSil
  2. V$ACTIVE_SESSION_HISTORY görünümü bekleme olaylarını gösterir. Şurayı bir incelermisin isteğin noktasında?

    http://jaffardba.blogspot.de/2006/11/power-of-ash-active-session-history.html

    Ancak, Tanel podel'in topsql.sql scripti isteğinize tam cevap verecek diye düşünüyorum. Bu scripti blogundan bulabilirsiniz.

    iyi günler,

    YanıtlaSil
  3. Bunun yanında sanırsam aşağıdaki sorgu tam istediğiniz...Hem cpu, hem IO hemde beklemeleri sql id bazında veriyor.

    select
    ash.SQL_ID ,
    sum(decode(ash.session_state,'ON CPU',1,0)) "CPU",
    sum(decode(ash.session_state,'WAITING',1,0)) -
    sum(decode(ash.session_state,'WAITING', decode(en.wait_class, 'User I/O',1,0),0)) "WAIT" ,
    sum(decode(ash.session_state,'WAITING', decode(en.wait_class, 'User I/O',1,0),0)) "IO" ,
    sum(decode(ash.session_state,'ON CPU',1,1)) "TOTAL"
    from v$active_session_history ash,
    v$event_name en
    where SQL_ID is not NULL and en.event#=ash.event#
    group by sql_id
    order by sum(decode(session_state,'ON CPU',1,1))

    YanıtlaSil