Home / SQL Server / SQL Server Administration / SQL Server Window Function Kullanımı ve Performansa Etkisi

SQL Server Window Function Kullanımı ve Performansa Etkisi

SQL Server 2005 ile birlikte gelen ve özellikle derecelendirme, gruplandırma, analitik işlemler ve satırları belirli kriterlere göre değerlendirme üzerine bize yardımcı olan Window Function’ları gerek development gerekse özel amaçlı querylerde sıklıkla kullanmaktayız.

Her yeni özellikte olduğu gibi, getirisi olduğu kadar, dikkatli olunmadığı sürece götürüsü de bir o kadar fazla olabilir, hatta faydadan çok zarara sebep olabilir. Bu yazıda en basit anlamıyla yürüyen bakiye örneğini inceleyerek RANGE ve ROWS keywordlerini kullanarak aralarındaki farkları incelemeye çalışacağız.

Şöyle bir senaryo düşünelim: Müşterilerimizin almış oldukları ürünlere istinaden hesaplarında oluşan bakiyelerin vade tarihlerine göre ilerleyen toplam şeklinde hesaplanmasını isteyelim. Bu örnek için AdventureWorks2014 veri tabanını kullanacağız. Senaryo için aşağıdaki gibi bir query yazdığımızı düşünelim.

t-sql_windowfunc_performance_00

Yukarıdaki queryi çalıştırdığımızda aşağıdaki result seti ve istatistikleri elde ediyoruz.

t-sql_windowfunc_performance_01

t-sql_windowfunc_performance_02

Varsayılan olarak PARTITION BY ve ORDER BY kullanımı sonrasında özellikle örneğimizde olduğu gibi kümülatif veri elde edilmesi istenen querylerde, yazılmasa da RANGE belirleyici keyword’ü devrede olacaktır. Bunun anlamı, kümülatif veri hesaplanırken sıralama işlemine dahil olan field için tüm satırları ekleyerek toplama dahil etmesidir. Yani toplama işlemi, geçerli olduğu yani işlem gördüğü satıra kadar tekrar hesaplanarak gerçekleşecektir. Yazdığımız query i aşağıdaki gibi değiştirip tekrar kontrol edelim.

t-sql_windowfunc_performance_03

Query i çalıştırdıktan sonra result seti, istatistikleri ve execution planı inceleyelim.

t-sql_windowfunc_performance_04

Yukarıdaki görselde, aynı verilerin listelendiğini görebiliyoruz. İstatistiklere ve execution planı da incelediğimizde aralarında hiçbir farkın olmadığını gözlemleyebiliriz. Yalnız dikkat etmemiz gereken nokta “Table ‘Worktable’. Scan count: 50517, logical reads 188657” değerleridir. Burada tempdb kullanımının beklenmedik bir şekilde yüksek olduğunu söyleyebiliriz.

t-sql_windowfunc_performance_05

t-sql_windowfunc_performance_06

Fakat query i aşağıdaki şekilde revize ederek çalıştırdığımızda çok farklı bir istatistik ile karşılaşıyor olacağız.

t-sql_windowfunc_performance_07-0

t-sql_windowfunc_performance_07-1

t-sql_windowfunc_performance_08

t-sql_windowfunc_performance_09

ROWS keyword ile kullanıldığında, yalnızca işleme tabii tutulan fied(lar)ın gruplama ve sıralama işlemine kendisi ve önceki satırın dahil olmasını sağlamış oluyoruz. Bu sebeple, ilk 2 queryde olduğu gibi tempdb kullanımı gerçekleşmiyor, ROWS keyword ile birlikte artarak giden toplama işlemi memory (bellek) üzerinde gerçekleştiriliyor ve beklenmedik I/O operasyonlarını önlemiş oluyoruz.

Sonuç olarak, SQL Server platformunun farklı durumlarda farklı tepkiler verebileceğini göz önünde bulundurmamız gerekiyor. Yukarıdaki basit örnekte olduğu gibi, sık kullandığınız Window Function’lar varsa, performans testine dahil etmeniz faydalı olabilir.

About Emrah Erdoğan

Check Also

SQL Server Extended Events Nedir?

SQL Server 2008 R2 versiyonu ile gelen ve SQL Server 2008 R2 sonraki sürümlerde de …

2 comments

  1. Eline sağlık Emrah. Baya faydalı bir yazı olmuş.

Bir Cevap Yazın

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