6 Ağustos 2011 Cumartesi

UNION vs UNION ALL

Performanslı sorgu yazma endişesi taşıyanlar zaten neden bahsedeceğimi anlamışlardır. :) Çok artistik bir girizgah oldu. :D

Bu ikisi ne yapar, kısaca bahsedersek, iki sorgudan(veya daha çok) dönen sonuç kümelerini birleştirirler. Ancak çok önemli bir farkla..UNION, iki sorgudan dönen kayıtları birleştirirken, duplicate kayıt varsa, yani her iki sorgudan dönen aynı eleman varsa, bunlardan birini eler. Yani bir nevi SELECT DISTINCT yapar.
UNION ALL ise geleni gideni alır. :) Seçici değildir, tüm elemanları birleştirir, duplicate endişesi taşımaz.

Hemen basit bir örnekle açıklayalım. Management Studio'yu açmaya üşendiğimden, burada yazacağım, parse ettiğinizde ufak tefek hataları düzeltirsiniz artık. :)

ErkekIsımleri tablosunda şu elemanlar olsun=Ali, Veli, Deniz
KızIsımleri tablosunda da şu eelmanlar olsun=Ayşe, Fatma, Deniz

select * from ErkekIsımleri
union all
select * from KızIsımleri
--Dönen sonuç kümesi şöyle olacaktır=Ali, Veli, Deniz, Ayşe, Fatma, Deniz

select * from ErkekIsımleri
union
select * from KızIsımleri
--Dönen sonuç kümesi şöyle olacaktır=Ali, Veli, Deniz, Ayşe, Fatma
Gördüğünüz gibi, UNION yaptığımda, Deniz elemanı her iki tabloda da olduğundan, tek bir tanesini aldı. Ancak UNION ALL yaptığımızda, her ikisini de aldı.

Şimdi UNION ALL "kaka", gibi bir imaj uyandırmış olmayalım. :)  Aksine, eğer duplicate endişesi taşımıyorsanız, UNION ALL kullanın. Çünkü distinct işlemi, execution plan'da da göreceğiniz üzere ekstra maliyet getirecek ve sorgunun yükünü arttırarak, performansı düşürecektir. Eğer mümkünse UNION ALL tercih edilmeli. Kendimi nedense seyirciyi terse yatırmış yönetmen gibi hissettim bir an. :P :)

Saçmalamaya başlamadan bu kaydı da burada sonlandırmış olayım. :)

1 yorum:

gökhan dedi ki...

güzel anlatım..