2012-05-18 12 views
21

Ich weiß in einfachen Abfragen die Leistung und Ausführungspläne der Distinct und Group By sind fast gleich.Wenn die Leistung von Distinct und Group By unterschiedlich ist?

z.B.

Aber ich habe in einigen Szenarien gelesen, dass ihre Leistung anders wäre, z. in Unterabfragen usw.?

Also, könnten Sie einige Beispiele oder erklären Sie einige Szenarien, wo ihre Leistung anders sind?

Vielen Dank

+1

Wenn sie das gleiche tun Ding, ihre Leistung ist die gleiche. Wenn sie verschiedene Dinge tun, kann ihre Leistung unterschiedlich sein. Wenn es bestimmte Beispiele gibt, die Sie interessieren, sollten Sie sie in Ihre Frage aufnehmen. – AakashM

+0

könnten Sie ein Beispiel geben? –

+2

Warum die Downvotes? Es ist eine beantwortbare, programmbezogene Frage (obwohl die Antwort "Nein, wir können nicht" lauten). – Quassnoi

Antwort

16

Wenn Sie einen berechneten Wert in der Feldliste enthalten Sie einen Unterschied in dem Ausführungsplan sehen.

select Value, 
     getdate() 
from YourTable 
group by UnitID 

select distinct 
     Value, 
     getdate() 
from YourTable 

Die group by Abfrage aggregiert, bevor er den skalaren Wert berechnet. Die distinct Abfrage berechnet den Skalarwert vor dem Aggregat.

+0

So könnte dies möglicherweise zu einem anderen Ergebnis und/oder Leistung führen. –

+2

@William - Nicht anderes Ergebnis. Das offensichtlichste Leistungsproblem, das ich gesehen habe, ist, wenn Sie String-Verkettungen mit dem 'for xml'-Trick machen. Ich habe sowohl eine Version gesehen, die 'distinct' verwendet, als auch eine Version, die' group by' verwendet und die 'group by' Version ist viel schneller. Aber selbst diese einfache Abfrage bei Ausführung über 500000 Zeilen, die 40 Gruppen generieren, zeigt einen Leistungsunterschied. Für mich dauert "group by" 80 ms und "distinct" 105 ms. –

+0

nein, es kann sicherlich zu einem anderen Ergebnis führen. Angenommen, Sie haben eine berechnete Spalte wie ROW_NUMBER() oder eine benutzerdefinierte Funktion, die einen Wert zurückgibt. In solchen Szenarios wird für Distinct zuerst die berechnete Spalte für jede Zeile in der Tabelle ausgeführt, dann werden die Scalar-Spalten hinzugefügt, während bei Verwendung von Group By zuerst die Skalarspalten gruppiert werden, dann wird für jede Gruppe die berechnete Spalte berechnet. Sie können also unterschiedliche Ergebnisse erzielen, da Distinct und Group By die berechneten Spalten in einer anderen Reihenfolge ausführen. –

7

Hier sind 2 Beispiele, ein für ein anderes Ergebnis und die andere für eine andere Leistung produzieren:

Example for producing different performance

Und das zweite Beispiel:

Example for producing different result