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.)
İ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