6

Over Partition By ve Group By arasındaki farkla ilgili birkaç soruyu daha önce göndermiş olsa da, bunun daha iyi performans gösterdiği konusunda kesin bir sonuç bulamadım.SQL Server Performansı Arası Bölme ve Gruplandırma Arasındaki Karşılaştırma

Over (Partition By)Over (Partition By)'un daha iyi bir yürütme planına sahip gibi göründüğü bir simple scenario at SqlFiddle kurarım (ancak bunlara aşina değilim).

Tablolardaki veri miktarı bunu değiştirmesi gerekiyor mu? Over (Partition By), sonuçta daha iyi performans gösteriyor mu?

enter image description here

enter image description here

+0

Ne aldığınızdan emin değilim. Elbette, 'byition' ile 'group by' arasında benzerlikler var, ancak hala farklı kullanım durumlarıyla iki farklı işlem var. Ve neden ikinci yürütme planının daha iyi olduğunu düşünüyorsunuz? Her ikisi de aynı kümelenmiş dizin taramalarını yapmak zorundadır, ancak ikincisi bunu yaparken daha az göreceli zaman harcıyor, bu yüzden açıkça daha uzun genel (sadece bu farklı türden dolayı yaklaşık iki kat daha uzun). – Luaan

+2

Birinin diğerinden daha iyi performans göstereceği evrensel bir kural yoktur. Performansı * hedefler * belirleyin, ardından sorunu çözen basit bir kod yazın. Ardından * performansı * ölçün. Sadece performans kabul edilemezse, o zaman değişiklik yapmayı düşünmelisiniz. Ancak, sorgu * doğruysa *, büyük olasılıkla, örn. indeksler arasında değişim olması gerekecek, bu ikisi arasında değişen bir fark yaratacaktır. (Birinin * diğerinden daha iyi performans gösterdiğini ve bu iki yöntem arasındaki sorguları mekanik olarak dönüştürmenin mümkün olsaydı, eniyileyici zaten bunu yapıyordu) –

+0

@Luaan: Benim açımdan, 2 yollu bir geliştirici bir şey yapmak ve aynı sonucu elde etmek, hepsi aşağıya doğru kayıyor: bir yol diğerinden daha iyi performans gösteriyor mu? Değilse, daha yaygın Grup By ile yapışırız. Bir meslektaşım, şimdi hakkında öğrenmek istediğim ** üzerinde ** ile seçkin alternatifi teklif etti. – Veverke

cevap

2

pencereli işlevi için yürütme planı açıkça yürütme planı (tüm grup tarafından grup için yürütme planı aşağı pencereli fonksiyon icra sağ üst içine eklenir plan). Genel olarak SQL, bir üst fıkra kullanmaktan ziyade grup için daha iyi optimize edilmiştir, ancak her birinin kullanımları vardır. Örneğin, her bir giriş için bir grup için grup toplamı ile çıktı almak isterseniz, pencere açma muhtemelen daha mantıklı olacaktır (ör. A.id|B.b1|sum B.b1 over A.id). Yapmadığınızdan, gerçekten değil. Temel olarak bir grubu kullanıyorsunuz, daha sonra grubun ima ettiği farklılığı kullanmak yerine tekrar ayrı bir yer alıyorsunuz.

+0

Şunu mu demek istediniz * SQL genel olarak * veya üstü tarafından grup için daha iyi optimize edilmiş mi? Demek istediğim, burada yürütme planı açık bir şekilde kötüdür *. – Veverke

+0

SQL genel olarak bir gruba göre daha iyi optimize edilmiştir, çünkü bir ek bilgi içerir (bu nedenle ayrı bir madde için gereksiniminiz vardır). Sorgunun verimli bir toplu sürümünü oluşturmak zor olduğunda yalnızca pencereli işlevleri kullanmanız gerekir. –

+0

Oh, "inferior" dediğinde * daha kötü mü? * Daha düşük maliyetler ifade ettiğini * düşündüğümüzü ve daha iyi olduğunu düşündüm ... – Veverke