Merge Join, Many To Many

Bildiğimiz üzere, yazdığımız querylerde birden fazla veri kaynağı ile çalışırken, ilişkiye tabii olan kaynaklar geliştirici tarafından belirtilen mantıksal ifadeler dikkate alınarak derlenir ve çalıştırılır. Bu kaynaklar table, view, table-valued function ya da file olabilir. Fakat fiziksel olarak kaynakların nasıl birleştirileceği ve getirileceğine engine karar verir.

Query yazarken en sık kullandığımız join türleri olan Inner, Left Outer ve Right Outer Join mantıksal operasyonları belirtmektedir. Fakat elde edilecek verinin oluşturulabilmesi için fiziksel olarak en uygun şekilde nasıl ilişkilendirileceği, performans açısından oldukça önem kazanmaktadır.

Makaleye konu olan Merge Join, engine tarafından kullanılan fiziksel operatörlerden biridir. Herhangi iki table birbiriyle Merge Join işlemine dahil olacaksa, tablelarda ilişkiye dahil olan alanların (kolonların) sıralı olması gerekmektedir. Eğer kaynaktaki alanlar sıralı değilse önce sıralanır daha sonra, Merge Join işlemi gerçekleşir. Fakat buradaki en önemli unsur, sıralama işlemidir. Çünkü sıralama işlemi milyonlarca kayıt içeren tablelar üzerinde gerçekleşiyorsa,  memory nin yetmediği durumlarda sıralama işlemi tempdb e yönlendirilerek, yoğun tempdb kullanımı gözlemlenebilir. Bu nedenle, relation ı Merge Join’e force ediyorsak, sıralama etkeninin göz önünde bulundurmamız gerekiyor.

Bir diğer unsur ise, tablelarda join e dahil olan alanların unique (benzersiz) olup olmaması durumuna göre Many to Many işlemi gerçekleşmesidir. Bunun anlamı, eğer iki alan da unique ise, sıralı olarak gelen satıra ait veriler karşılaştırılıp çıkışa yönlendirilir. Fakat alanlar unique değilse, tekrar veri gelebileceği için versiyonlama denilen işlem gerçekleşir, eğer memory de yeterli alan tahsis edilirse bu işlem memory de gerçekleşir fakat her ihtimale karşı tempdb üzerinde çalışabilmek için istatistiklerde Worktable çıktısını görebiliriz. Eğer memory tahsisatı yeterli değilse, tempdb kullanımı gerçekleşir ve fiziksel operatörler arasında en performanslı tür olan Merge Join’in avantajı olan karşılaştır ve çıkışa gönder süreci dezavantaja dönüşebilir.

Bu durumu test edebilmek için öncelikle test tablelar için clustered index tanımlayalım.

Kontrol için aşağıdaki sorguyu yazıp execution planı inceleyelim.

Her iki tableda join e dahil olan SalesOrderID alanları için, index tanımlı olduğu ve dolayısıyla sıralı olduğu için Sort işlemi gerçekleşmedi. Burada dikkat etmemiz gereken nokta, Many to Many değeri şu an ne durumda?

İşaretli alanda görüldüğü üzere, Many to Many değeri True. Yani unique olmayan alanlar joinde yer aldığı için versiyonlama dediğimiz işlem gerçekleşti. Bunu görebilmek için istatistik çıktısını kontrol edebiliriz. Worktable ifadesi tempdb kullanımını işaret etmektedir, fakat Merge Join’de tempdb kullanımını beklemeyiz.

Aynı işlemi bu kez join e dahil olan ve left referansta yer alan table a ait alana tanımlı index i unique olarak değiştirip, çıktıyı tekrar kontrol edelim.

Yukarıdaki index create scriptini ve sorguyu tekrar çalıştırdığımızda bu kez Many to Many değerinin False olduğunu görüyoruz.

İstatikstik çıktısını incelediğimizde ise, Many to Many ve tempdb kullanımının gerçekleşmediğini gözlemleyebiliyoruz.

Bir cevap yazın

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