24 Eylül 2015 Perşembe

Where Clause da Performance Tuning


Sql server'ın bir çok yararlı fonksiyonu bulunmakta. Hatta bu fonksiyonlar sayesinde çok karmaşık kodları gayet kolay bir şekilde yazılabilirliği arttırır. Aynı zamanda Sql Server içerisinde kullanıcı tanımlı fonksiyonlar oluşturabiliriz. Select cümleleri içerisinde kullanılan uppercase, substring gibi fonksiyonlar Sql Server performansına çok fazla etki etmese bile where cümlesinin hatalı kullanımı performansı oldukça kötü bir şekilde etkileyebilir. Select cümlesi içerisinde bir fonksiyon kullandığınız zaman datalar hazır bir şekilde döndürülür. Tabii ki eğer siz dataları filtrelemeye ihtiyaç duymuyorsanız çünkü bu şekilde karşınıza veritabanınızın boyutuna göre yüzbinlerce satır dönebilir. Eğer böyle kalabalık bir sql çıktısından ziyade filtre edilmiş verilere ihtiyacınız varsa bu noktada Where clause kullanmanız gerekmektedir. Bu noktada Sql Server index seek yapmak yerine table scan ve index scan yaparak  (tabloda eğer kullnaılmış bir index varsa) doğru sonuçları gösterecektir. Bu sebeple dataların belirlenen her bir satırları sizin kriterlerinizle eşleşip döndürülecektir. Bazı basit sorgularla where clause kullanımının etiklerini size göstermeye çalıştım. Execution plan sayesinde query'lerin ne şekilde çalıştığını anlamış olacağız.

Örnek1:
İlk örnekte left fonk. kullanarak ilk iki karakteri email adreslerden alıyoruz. Eğer 'As' kriteri mevcutsa her bir satır incelenir ve var olanlar döndürülürler. (Email adreste index kullanılmıştır.)

SELECT EmailAddress from person.contact
Where left(EmailAddress,2) = 'As'


Aşağıdaki query planına göre Sql Server’ın index taraması yaptığını görüyoruz. Yani sonuçlar dönmeden önce bütün satırlar gözden geçirilmiştir. Query’de kullanılan Left fonksiyonu yüzünden bu şekilde bir çıktı almış oluyoruz.

Şimdi yukarıda yazmış olduğumuz query’nin bir diğer versiyonunu inceleyelim. Burada left fonksiyonu yerine like clause kullanacağız. Burada amacımız yukarıda olduğu gibi bütün datalar içerisinde ‘AS’ ile başlayanları listelemek olacak. İndex’leme EmailAdress üzerinde oluşturulmuştur ve bundan dolayı yukarıda olduğu gibi index scan yerine like clause kullanıldığı için index seek Sql Server tarafından kullanılmıştır.

SELECT EmailAddress from person.contact
Where EmailAddress like ‘As%’

Query planında da görüldüğü gibi index seek, index scan’ e göre daha verimli olduğu açıkça görülmektedir.


Örnek 2

Şimdiki örneğimizde ise Upper clause kullanarak EmailAddress kolonu üzerindeki datalar üzerinde değişiklikler yapacağız.

SELECT EmailAddress From  person.Contact
Where Upper(EmailAddress) like ‘As%’


SELECT EmailAddress from person.Contact
Where EmailAddress like ‘%As’


Yukarıdaki execution planlar incelendiğinde görüldüğü gibi index scan ve index seek arasındaki fark açıkça görülmekte ayrıca upper kullanıldığı zamanki performans düşüşü de gayet net şekilde gözükmektedir.

Örnek 3:

Şimdi ki yazacağımız query’ de Where clause’da  DateDiff fonksiyonunu kullanalım. Aşağıda yazdığımız query’de ModifiedDate ve getdate() arasındaki farkın sıfırdan büyük olduğu durumları listeleyecektir. ModifiedDate alanında index bulunmaktadır.

SELECT ModifiedDate from person.contact
Where datediff(minute,ModifiedDate, getdate())>0

Yukarıda ki query’de fonksiyon kullandığı için Sql Server index scan yapmıştır.

Aşağıda yazılan kodda direk olarak ModifiedDate ile getdate() karşılaştırması yapılmıştır.

SELECT ModifiedDate from person.contact
Where ModifiedDate < getdate()


Bu query de fonksiyon yazılmadan sorgu yapıldığı için index seek kullanılmıştır.

            Sorgular boyut olarak küçük olan AdventureWorks üzerinde yazılmıştır. Yapay bir sistem üzerinde çalışıldığı için performans kaybı veya artışı çok hissedilebilir değildir. Eğer çok daha büyük sistemlerde çalışırsanız buradaki farklılıklar daha göze batar durumda olacaktır. Where clause lar da fonksiyon kullanımından kaçınırsanız oldukça yüksek performans sağlayabilirsiniz. Fonksiyon kullanmak yerine daha farklı alternatifler kullanarak başarılı bir performance tuning çalışması yapmış olursunuz.















0 yorum :

Yorum Gönder