MS-SQL

SQL Server’da “Execution Plan” ile İlgili

Sql Server’da bir sorgu için plan oluşturmak, sorgunun sunucu içindeki döngüsünde en önemli yere sahip adımdır desek yanılmayız sanırım.

Bir sorgunun SQL sunucuda geçirdiği süreçler arasında sorgunun “parse” edilmesi, ağaç yapısının oluşturulması, planın oluşturulması gibi işlemler vardır. Planın oluşturulması sorgu kaynaklarının (tablo, indeks gibi) istatistik bilgilerinin incelenmesi, parametrelerin incelenmesi, indekslerin değerlendirilmesi, verinin değerlendirilmesi gibi yorucu işlemler içerir. Bundan dolayı plan hazırlamak yorucu bir iştir. Yorucu bir iş olduğu düşünülürse sunucunun hazırlanan planları bir önbellekte saklaması gayet makul bir davranıştır.

Sunucu bir sorgu ile karşılaştığında öncelikle sorgu için daha önceden hazırlanmış bir plan var mı diye bakar. Varsa ve plan hala kullanılabilir (geçerli) durumda ise tekrar oluşturmak yerine bunu kullanır. Bazı durumlarda sorgu için bir plan olsa bile geçerliliğini yitirmiş olabilir. Bunun nedenleri çeşitlidir. Örnek olarak sorgu kaynaklarının (tablo, indeks gibi) ‘ALTER’ edilmesi verilebilir. Bazı durumlarda da sorgu için kullanılan plandan memnun olmayabiliriz ve tekrar oluşturulmasını isteyebiliriz. Bu durumda tekrar derleme işlemi istenebilir. Bunun için sp_recompile, WITH RECOMPILE gibi seçenekler kullanılabilir.

Parametrik olmayan sorguların planları tekrar kullanılamaz. “select * from t where a=1”,”select * from t where a=2” bu iki sorgunun planı ayrı ayrı oluşturulur. Ancak “(@1 int) select * from t wher a=@1” parametrik bir sorguya işaret eder. Bundan dolayı ad-hoc şeklindeki sorguların “EXEC sp_executesql” kullanılarak çalıştırılması faydalıdır. Bir “Stored Procedure” doğal olarak parametriktir. SQL server ad-hoc sorguları otomatik olarak parametrik hale getirmeye çalışır. Bunu her durumda yapmaz. Faydalı olduğuna karar verdiği durumda yapar. Bu işleme “auto-parameterization” denir. SQL 2005 ile birlikte gelen özellik sayesinde her durumda sorgunun parametrik yapılması isteğinizi sunucuya iletebilirsiniz. Bunun için “PARAMETERIZATION FORCED” kullanabilirsiniz. Ancak bu durumda yeterli olmayan bir planla sorgunu işletilmesine neden olabilirsiniz.

Sorgu planların tekrar kullanılabilir olması önemli bir konudur ve sorgu ile alakalıdır. Yazılan sorgu oluşturulan planın tekrar kullanımına izin vermiyor olabilir. Bu durumda o sorgu için her çalıştırmada tekrar plan oluşturulur. Planın tekrar kullanımını engelleyen konular çeşitlidir ve sorgu yazılırken dikkate alınmasında fayda vardır. Nedenler için http://technet.microsoft.com/tr-tr/library/cc966425(en-us).aspx adresindeki “Causes of Recompilations” bölümü incelenebilir. SQL sunucunun ön bellekte tuttuğu planları ve tekrar kullanım durumlarını aşağıdaki sorgu ile görebilirsiniz.

SELECT TEXT ,cp.*
FROM sys.dm_exec_cached_plans cp
CROSS APPLY sys.dm_exec_sql_text(plan_handle)
WHERE cacheobjtype = ‘Compiled Plan’

usecounts alanı size planın kaç defa kullanıldığını gösterecektir. Eğer değeri 1 olan çok sayıda planınınız var ise bu performans kaybına yol açan bir durum olarak değerlendirilebilir. Bu durumun iki dez avantajı vardır. Birincisi sunucu bu planları hazırlamak için her seferinde kaynak harcamaktadır. Diğeri ise bu planların her biri hafızada ayrı bir yer kaplamaktadır ve plan önbelleği içindeki eleman sayısını kalabalıklaştırmaktadır.

Sonuç olarak “execution plan”, SQL sunucusunda performans kriterleri içinde önemli bir yer tutar ve önem verilmelidir.

 

 

 

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir