Hurriyet

5 Eylül 2013 Perşembe

Oracle Veritabanı: Uzun Süren İşlemler - V$SESSION_LONGOPS

Veritabanındaki sorgularımız her zaman kısa sürelerde sonuçlanmayabilirler. Sorgularımız bütün tabloyu full scan yaparak tararlarsa ve o tablolar içerisinde cok  büyük miktarda veri varsa, sorgulanan tablolarda gerekli index`ler yoksa, o zaman sorgularımızın bitmesi çok uzun sürebilir. Aşağidaki sorgumuz ile uzun suren sql ifadelerimizi bulabiliriz.

SELECT s.username,  
     sl.sid,  
     sq.executions,  
     sl.last_update_time,  
     sl.sql_id,  
     sl.sql_hash_value,  
     opname,  
     target,  
     elapsed_seconds,  
     time_remaining,  
     sq.sql_fulltext  
  FROM v$session_longops sl  
  INNER JOIN v$sql sq ON sq.sql_id = sl.sql_id  
  INNER JOIN v$session s ON sl.SID = s.SID AND sl.serial# = s.serial#  
  WHERE time_remaining > 0 

Uzun Süren İşlemler:

Uzun süren işlemler sadece sql`ler olmayabilir. Backup`larin alınması, import export işlemleri gibi database`i ilgilendiren işlemler de aşağidaki sorgumuzda bulunabilinir. Sadece geçen zamani değil aynı zamanda kalan işlem süresini de görebiliriz.

 SELECT osuser,  
     sl.sql_id,  
     sl.sql_hash_value,  
     opname,  
     target,  
     elapsed_seconds,  
     time_remaining  
  FROM v$session_longops sl  
 inner join v$session s ON sl.SID = s.SID AND sl.SERIAL# = s.SERIAL#  
 WHERE time_remaining > 0  


Uzun Süren Sessionlar ve Onların Kill Edilmesi:

Yukarıdaki gibi uzun süren işlemleri bulduktan sonra aşağıdaki gibi herbirini kill edecek sorgularımızı da çıkartacak bir sorgu yazabiliriz. Aşağıdaki sorgumuz bu işi görmektedir. Çıkan sonucu alıp hepsini bir kere de execute edebiliriz.


select  
 s.username,  
 s.sid,  
 s.serial#,  
 s.last_call_et seconds_running,  
 q.sql_text,  
 'Alter system kill session '''||s.sid||','||serial#||''' immediate;' as SQL_to_kill_long_running_sqls  
 from  
 v$session s join v$sqltext_with_newlines q on s.sql_address = q.address  
 where  
 status='ACTIVE'  
 and  
 type<>'BACKGROUND'  
 and  
 last_call> 10 --saniye  
 order by  
 sid,  
 serial#,  
 q.piece;  

10 Saniyeden Uzun Süre Çalışan Session'lar:

Aşağıdaki sorgumuzla da gerektiğinde 10 saniyeden uzun süre çalışan bütün sesssionları kill edebiliriz.


 select  
 s.username,  
 s.sid,  
 s.serial#,  
 s.last_call_et seconds_running,  
 q.sql_text  
 from  
 v$session s join v$sqltext_with_newlines q on s.sql_address = q.address  
 where  
 status='ACTIVE'  
 and  
 type <>'BACKGROUND'  
 and  
 last_call > 10 --saniye  
 order by  
 sid,  
 serial#,  
 q.piece

Uzun Süren İşlemlerin Sql'llerinin Bulunması:


Uzun süren işlemler sorgumuzundan gelen SID ve SERIAL# bilgilerini DBA_HIST_ACTIVE_SESS_HISTORY tablosunda sorgulayarak ilgili SQL_ID'yi bulabiliriz. Bu SQL_ID bulunduktan sonra da v$sql'den SQL_ID ile sorgulayabiliriz.

Aşamalarımızı özetlersek yukarıdaki long session ops'taki sid ve serial# bilgilerini  aşağıdaki sorgumuzda kullanıp ilgili sql_id'yi buluruz.
 select   
 *  
 from DBA_HIST_ACTIVE_SESS_HISTORY  
 where   
 sample_time>sysdate-1  
   
 and instance_number in (1,12)  
 and session_id='2857'  
 and session_serial#='9617'  
 order by sample_time,instance_number,SESSION_ID;  

Aldığımız SQL_ID bilgisini v$sql tablosunda sorgulatırız.

select * from v$sql where sql_id='0p1cypdyjuf2y';  

Referans:

http://www.mydbanotes.com/2010/06/identify-oracle-long-running-sessions.html
http://www.gplivna.eu/papers/v$session_longops.htm

Hiç yorum yok:

Yorum Gönder