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.

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

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. SQL Server, Yazdığımız query i aşağıdaki gibi değiştirip tekrar kontrol edelim.

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

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.

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

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.

Bir cevap yazın

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