Özet: DBA’lere, veritabanlarında en çok “Executions” yapan sorguların tespiti, bu duruma karşı alınabilecek önlemler hakkında bilgi vermek.

 

“Executions” Nedir?

“Executions”, adından da anlaşılacağı gibi, “sorguların kaç kere çalıştırıldığını” gösteriyor.

 

“Executions” Neden Önemli?

Bu bilgi bize, veritabanında en çok çalışan sorguları veriyor. En çok çalışan sorgu, kaynakları en çok tüketme ihtimali olan sorgular demek oluyor.

Bir sorgu çok fazla physical I/O(Disk Reads) yapıyor olabilir, çok fazla logical I/O(Buffer Gets) yapıyor olabilir, çok fazla CPU kullanıyor olabilir. Bu çok fazla kaynak tüketimlerinin bir anlam ifade etmesi için, kaynağı tüketen sorguların kaç kere çalıştığı en önemli faktörlerdendir.!

Sorunlu sorgu birkaç kez çalışıyorsa veritabanını ya da uygulamayı muhtemelen etkilemiyordur. Ama ciddi I/O ya da cpu tüketen bir sorgu, günde binlerce, onbinlerce defa çalışıyorsa, ciddi sorunlar yakın demektir.!

Örneğin; bir job içinde 1000 defa çalışan ve çalıştırma başına 1 sn süren sorgu var diyelim. Bu sorgunun planı değişse, çok I/O yapan bir plan çalışmaya başlasa ve sorgunun çalışma süresi 2 sn’ye çıktı diyelim. 1000 defa çalışınca 1000 sn uzaması anlamına geliyor. Bu da job’un 16dk kadar uzaması demek oluyor.!

 

“Executions” çok ise ne yapmalı?

Sorgunun binlerce defa çalışması gerekiyorsa buna yapılacak bir şey yok.

DBA olarak bizler burada, çok fazla çalışan bu sorguların “execution başına(per exec)” tükettiği kaynakları ele alıp, onları azaltmanın yollarına bakmalıyız.

Eğer bir sorgu execution başına, çok fazla Buffer_Gets ya da Disk Reads yapıyorsa, ve bu sorgu bir de en çok çalışan “Executions” listesinin başlarında ise, bu sorgulara öncelik verip, daha performanslı çalışmasının yollarına bakmalıyız.

 

“Executions” çok yapan sorgular nasıl bulunur?

En çok “Executions” sorgularını geçmişe yönelik alttaki AWR bölümlerinde (SQL ordered by Executions) bulabileceğiniz gibi, mevcut durumda v$sql ya da v$sqlarea view’lerinden aşağıdaki sorgularla da görebilirsiniz.

Execution_1

Select * from
 (select parsing_schema_name "User ",
 sql_id,hash_value, executions, 
 rows_processed, rows_processed/executions "Rows/Execution",
 sql_fulltext
 from v$sqlarea
 where executions > 10000
 and parsıng_schema_name not in ('sys','dbsnmp','sysman')
 and parsıng_schema_name not like 'xx%'
 order by executions desc)
 where rownum <= 30;

Execution_1_out

Görüşmek üzere…