Execution Plan

Bir çoğumuz zaman zaman yazmış olduğumuz sql sorgularının çok yavaş çalıştığına şahit olmuşuzdur.Sorguların yavaş çalışması bir çok nedenden kaynaklanıyor olabilir.Bunlardan en bilinenleri şunlardır:

       Veri modelinin hatalı tasarlanması

       Indexlerin yanlış alanlar üzerinde oluşturulması

       Gerekli alanlar üzerinde indexlerin oluşturulmaması

       Sorgunun kötü yazılmış olması

 

Bu nedenler gibi daha bir çok durum sorgunun çalışmasını yavaşlatabilir. Yavaş çalışan bir sorguyu analiz etmenin en iyi yolu Execution Planına(Sorgu planı) bakmaktadır.Execution planlar sql sorgularının ne şekilde çalıştığına dair en ayrıntılı bilgiyi veren çalışma planıdır.Bu plana bakarak hangi tablolarda veya indexlerde ne şekilde arama yapıldığı,her bir tablodan ne kadar kayıt okunduğu,fiziksel ve mantıksal okuma sayısı,her bir işlemin yüzdelik olarak toplam maliyeti bilgilerine ulaşılabilir  

 

Bir sorgu çalıştırılduğında ilk önce sorgu parse edilir daha sonra  optimizer’a gönderilir. Optimizer veritabanında tutulan bazı bilgileride kullanarak  sorgunun  çalışma şekli, kullanılacak indexleri,yapılacak join türlerini belirler.Optimizer bu kararları verirken gerekli CPU  ve I/O işlemlerini  göz önünde bulundurur.Bu plana maliyet bazlı plan da (Cost Based Plan) denir.Optimizer bu süreçte bir çok plan üretir fakat hangisi en hızlıysa onu kullanır.Optimizer maliyet bazlı planı çıkartırken veritabanında tutulan  istatistikleri kullanır.Bu istatistikler tablolardaki veriler hakkındaki bazı verilerdir.Bu veriler tahmini planın  çıkartılmasında çok önemlidir çünkü veritabanında tutulan istatistikler ne kadar doğru olursa o kadar gerçeğe yakın bir sorgu planı çıkartılacaktır.Optimizer,tahmini çalışma planı çıkartıldıktan sonra bu plan  cache de tutlan gerçek çalışma planı ile karşılaştırılır.Eğer ikisi aynıysa var olan gerçek çalışma planı kullanılır.

 

Tahmini ve Gerçek çalışma planı

         Tahmin çalıma planı optimizer tarafında üretilen ve sorgunun ne şekilde çalışacağı varsayılan plandır.Optimizer sorgu için daha önceden üretilen parse tree ve istatistikleri kullanarak bu planı üretir.Gerçek çalışma planı ise gerçekte sorgu çalıştığında oluşan plandır.Gerçek plana bakarak gerçekte sorgu çalıştığında nelerin olduğu anlaşılabilir.Eğer tahmini plan ile gerçek plan arasında fark yoksa gerçek plan tekrar üretilmez ve bu da büyük bir performans artışı sağlar.

         Bazı durumlarda execution planlar yeniden derlenir .Execution planın yeniden derlenmesi çok maliyetli olabilir.Bu durumlar şu şekilde sıralanabilir: 

       Sorgunun kullanıdğı tablonun yapısının yada şemasını değişmesi

       Sorgunun kullandığı indexin değişmesi yada silinmesi

       Sorgunun kullandığı istatistiklerin güncellenmesi

       sp_recompile fonksiyonun çağrılması

       Sorgunun kullandığı tabloya çok fazla insert veya delete yapılması

       Aynı sorguda DDL ve DML in birlikte kullanılması

       Sorguda kullanılan temporary tablonun şemasının ya da yapısının değiştirilmesi

       Sorguda kullanılan dinamik,cursor yada cursor daki for browse in değiştirlmesi

 

Execution Plan Formatları

 

Görsel Plan

        Management studio da  Ctrl+M  ve Ctrl+L  ile ya da şekildeki buttonlara tıklanarak  tahmini yada gerçek plan çalıştırılabilir


Göersel plan sorgunun çalışma şeklini görsel olarak gösteren plan türüdür.Hem gerçek plan hem de tahmini plan görsel plan şeklinde detaylı olarak izlenebilir.

 

Text Plan

Okunması her ne kadar zor olsa da çok daha fazla bilgi verilir.Üç türlü text plan mevcuttur:

showplan_all:Yeterli miktarda veri miktarı ile tahmini çalışma planı gösterilir

showplan_text:az bir miktar veri ile tahmini çalışma planı gösterilir.

statisticsprofile:Yeterli miktarda veri ile gerçek planı gösterir.

 

XML Plan

Xml şeklinde gösterilen plan ile en fazla bilgi sunulur.Bilgiler XML formatında gösterilir.İki türlü XML paln formatı vardır

showplan_xml : çalıştırılmak için optimizer tarafından üretilen plandır.

statistics_xml : XML formatındaki gerçek plan

  

USE AdventureWorks

GO

SELECT * FROM Person.Contact

 

Bu sorgu için oluşturulan  execution plan şu şekildedir.


Plan incelenerek sorgu hakkında bir takım bilgiler elde edilebilir.Bu basit sorguda maliyetin tamamı Person.Contact tablosu üzerinde yapılan aramadan oluşmaktadır.Bu bilgi optimizer tarafından plandaki her bir şekil için üretilir.Tabloda index olduğu için ve where kısmında bir kısıt belirlenmediği için tabloda index scan yapılmıştır.Soldaki select sadece mantıksal bir gösterim olup iki şekil arasındaki ok işareti iletilen verinin miktarı hakkında bilgi verir.Eğer bu ok işareti  kalın isi çok fazla veri okunuyor demektir. Sorgu şu şekilde değiştirilirse:

USE AdventureWorks

GO

SELECT * FROM Person.Contact WHERE ContactID=10

        

        Sorgu planıda  şekilde göründüğü gibi değişecektir.Bu durumda arama index seek’ e göre  yapılacaktır.İndex seek index scan’  a göre çok daha hızlıdır.Ayrıca aradaki ok işaretinin de inceldiği görülmektedir çünkü ilk sorguya göre çok daha az veri okunmaktadır.Bu şekilde incelemeler yapılarak sorgular çok daha performanslı hale getirilebilir.

Tooltipler

Execution planda şekillerin üzerine gelindiğinde bunlar hakkında ayrıntılı bilgiler veren tooltipler çıkmaktadır.

        Bu tooltip plan hakkında genel bilgiler yada sorgunun bir kısmı hakkında spesifik bilgiler vermektedir.En başta görünen select şeklinin üzerine gelinirse sorgunun genel özellikleri hakkında bir takım bilgilere ulaşılabilir.Bu bilgiler şunlardır:

Cached plan size:Bellekte tutulan planın büyüklüğüdür.Bellekte alana ihtiyaç olursa buradaki planı silinebilir.Bu şekilde bellek kazancı sağlar.Fakat bu durumda planın yeni bir sorguda tekrar üretilmesi gerekir.

Degree of parallelism:Paralellik derecesi hakkında bilgi verir.

Estimated Operator Cost:Her bir alt işlemin tutacağı maliyet her bir şeklin altında yüzde olarak  gösterilir

Estimated Subtree Cost:Optimizer ın bir önceki adımlar için düşündüğü tahmini maliyet toplamı

Estimated Number of Rows:Tahmini kayıt sayısı

        Sorguya ilişkin genel bilgiler veren bu tooltip dışında sorgunun bir kısmı için bilgi veren tooltip te sorguyu analiz etmede oldukça kullanışlıdır.Yavaş çalışan bir sorguda hatanın gerçek kaynağının nerde olduğunu anlamak için bu kısımlar ayrı ayrı incelenmelidir.Bu şekilde sorun teşkil eden noktalar tespit edilip düzeltilebilir.

        

        Physical Operation sorgu çalıştığında oluşan Logical Operator ise optimizer ın çalışması sonucu oluşan sonuçtur.Genellikle aynı sonucu üretirler.Actual Number of Rows gerçek kayıt sayısı,Estimated Rows size tahmini kayıt sayısını  belirtir.Estimated I/O Cost disk okuma yazma, Estimated CPU Cost işlemci gereksinimine karşılık gelir.Bu hesaplamalar istatistiklere dayanır ve optimizer tarafından üretilir.Eğer veriler sıralı bir şekilde işlenmişse(Order By yapılmışsa)  order by alanı  true olur.Bunun dışında herhangi bir ikon üzerine sağa tıklanarak Properties seçilirse daha ayrıntılı bir şekilde işlemin detaylarına ulaşilabilir.

Text Plan

        Execution planı text fromatında görebilmek için  sorgunun başına

SET SHOWPLAN_ALL ON  yazılmalıdır.

Text planları her ne kadar daha fazla bilgi verselerde anlaşılabilirliği azdır.

XML plan

        Xml formatında execution plan alabilmek için

SET STATISTICS XML ON 

        Yazılırsa xml formatında execution plan alınır.Xml formatında alınan execution planda daha ayrıntılı ve yapısal bir data verilir.Text plana göre okunabilirliği daha yüksektir fakat görsel plan kadar anlaşılabilirliği yüksek değildir.

set statistics io on

        Bu komut çalıştırılacak sorgunun istatistik bilgilerinin de mesaj olarak gösterilmesini sağlar.

set statistics io on

SELECT [ContactID],[NameStyle] FROM [AdventureWorks].[Person].[Contact]

Bu sorgu için üretilen örnek istatistik bilgisi şu şekildedir.

Table 'Contact'. Scan count 1, logical reads 569, physical reads 0, read-ahead reads 0 read-ahead reads

        Contact tablosu 1 defa taranmış cache’den 569 okuma yapılmıştır. physical reads 0 bilgisi diskten okuma yapılmadığını gösterir.Diskten okuma yapmak her zaman daha maliyetlidir.read-ahead readssorgu için cacheye alınan page sayısını gösterirken,lob logical reads, lob physical reads, lob read-ahead reads cache’e alınan, cache’den okunan ve diskten okunan text,ntext,image ,varchar(max) sayısı hakkında bilgi veriri.

set statistics time on

        Bu komut bize sql server’ın bir sorguyu çalıştırmak için  ne kadar işlemci süresi ve ne kadar sql server süresi harcandığını gösteriri.

set statistics time on

SELECT * FROM [AdventureWorks].Person.Address

        Bu sorgu için üretilen zaman bilgisi şu şekildedir.

SQL Server parse and compile time:

   CPU time = 0 ms, elapsed time = 64 ms.

SQL Server Execution Times:

   CPU time = 0 ms,  elapsed time = 1 ms.

 

SQL Server Execution Times:

   CPU time = 46 ms,  elapsed time = 935 ms.

        İlk bilgi bize parse ve compile için harcana süre bilgisini verirken ikinci ve üçüncü bilgi ise set statistics time on ve yapılan select için ayrı ayrı harcanan execution süresini verir.Bu tür bilgiler kullanılarak veritabanının performansla ilgili işleyişi hakkında bir takım bilgiler edinilebilir.Bu bilgiler sistemin daha etkin çalışabilmesi açısından çok büyük önem arzetmektedir.


   Puan : 8,0/10     Oy sayısı : 3     Okunma sayısı : 2736     18.09.2011

Henüz bu yazıya yorum yapılmamış ilk yorumu yapmak ister misiniz?


İsim   
Mail    
  
     
 

Son Yazılar

Execution Plan
Veritabanı Performans Unsurları

Arşiv

Popüler Taglar

[asp.net] [asp] [sql] [t-sql] [oracle] [c#] [wcf] [wpf] [silverlight] [ajax] [javascript] [visual studio] [toad] [sqldeveloper] [yazılım] [performans] [execution plan] [optimizer] [css] [html] [jquery] [java] [mysql] [linq] [framework] [microsoft]
Loading