Distinct mi - Group By mı?

30. Ağustos 2008

Bu weblogta, "SQL Server da sorgu atarken Distinct mi yoksa Group by mı tercih etmeliyim?" sorusunu soran 2 arkadaşa yanıt olması için kısa bir açıklama yapmaya çalışacağım. Bu açıklamanın başkaları içinde yararlı olduğunu düşündüğümden buraya koymayı uygun gördüm. Aslında bununla ilgili internette yazılı birçok kaynakta bulunmakta.

Öncelikle bu sorunun cevabı hayatımızda karşılaştığımız çoğu soruya verilecek yanıtla birebir aynı "Duruma göre değişir(it depends!)". Yapacağınız tercih, sorgu cümlesinde yapmak istediklerinize göre değişiklik gösterecektir. Tercih etmeliyim derken "Distinct mi yoksa Group by mı, hangisi daha hızlı çalışıyor" diye soruyorsanız: 

Dokumanlar isimli tablomda, DokumanGrup isimli dokumanların gruplandırıldığı bir sütunum olduğunu varsayarsak..:

-select distinct DokumanGrup from Dokumanlar

-select DokumanGrup from Dokumanlar group by DokumanGrup

Eğer yukarıdaki sorgular gibi "Distinct" ve "Group by" yapılarını basit, sadece o sütun ya da sütunlardaki verileri tekrarlanmadan göstermek için kullanıyorsanız her ikisi de aynı sonuçları veriyor, aynı hızda ve aynı işlem planını kullanarak çalışıyor(Execution plan - Sql Serverda yazdığınız sorgunun performansını ölçmek için kullanmanızı şiddetle tavsiye ederim Wink Şiddetli tavsiye nasıl oluyorsa artık)

Hız değil de kullanım açısından bakacak olursak Group by (Aggregate) toplam fonksiyonlarıyla kullanılmaktadır. Zaten sık sık veritabanı işlemlerinde bu fonksiyonları kullanıyorsanız, "Distinct"'in "Group by"'a göre ne kadar basitleştirilmiş olduğunu fark etmemek imkansız.

Sık Kullanılan Toplam(Aggregate) Fonksiyonları:

MIN(ifade), MAX(ifade), AVG(ifade), SUM(ifade), COUNT(ifade) - COUNT(*)

-select DokumanGrup, COUNT(*) from Dokumanlar group by DokumanGrup   -> Döküman Gruplarını ve yanında kaç tane dokümanın bu grupta bulunduğunu gösterir.

 

Bu arada Group by'la benzer olmasa da Distinct'i de toplam fonksiyonlarıyla kullanmamızın bir yolu var; TOPLAMFONKSİYONU(Distinct SütunAdı). Min ve Max'ta zaten tek sonuç gösterdiğinden kullanmak hiç bir işinize yaramayacaktır. Kullanımına bir iki örnek verecek olursak;

-select Count(Distinct DokumanGrup) from Dokumanlar   -> NULL olan harici kaç tane Döküman Grubu çeşidi olduğunu gösterir.

-select AVG(Distinct SinavNotu) from Ogrenciler   -> Öğrenciler tablomuzda SinavNotu aynı olan öğrencileri bir kişi sayarak çıkardığımız dağılımdaki ortalamayı hesaplar. 

Sonuç olarak ben kullanım yerine göre "group by" da "distinct" de kullanıyorum ve genel itibariyle bir tercih yapmayı gerekli görmüyorum. Kullanım alanlarını bildikten sonra sorduğunuz soruya kendi başınıza cevap bulacağınızı düşünüyorum.

Bu konuda ekstra bilgi veya görüşlerini paylaşmak isteyenlerin yorumlarını bekliyorum..

Makaleler, Sql Dersler , ,