493 Stimmen

Gibt es einen Unterschied zwischen GROUP BY und DISTINCT

Neulich habe ich etwas Einfaches über SQL gelernt:

SELECT c FROM myTbl GROUP BY C

Hat das gleiche Ergebnis wie:

SELECT DISTINCT C FROM myTbl

Ich bin neugierig, ob es einen Unterschied in der Art und Weise gibt, wie eine SQL-Engine den Befehl verarbeitet, oder ob es sich wirklich um dasselbe handelt.

Ich persönlich bevorzuge die eindeutige Syntax, aber ich bin mir sicher, dass das eher aus Gewohnheit so ist.

EDIT: Es handelt sich nicht um eine Frage über Aggregate. Die Verwendung von GROUP BY mit Aggregatfunktionen verstanden wird.

6voto

Wenn Sie ein GROUP BY ohne Aggregatfunktion verwenden, wird es intern als DISTINCT behandelt, so dass es in diesem Fall keinen Unterschied zwischen GROUP BY und DISTINCT gibt.

Wenn Sie jedoch eine DISTINCT-Klausel haben, sollten Sie diese besser für die Suche nach eindeutigen Datensätzen verwenden, da das Ziel von GROUP BY darin besteht, eine Aggregation zu erreichen.

5voto

Ram Ghadiyaram Punkte 32261

Aus der Sicht von Teradata :

Aus Sicht der Ergebnismenge spielt es keine Rolle, ob Sie DISTINCT oder GROUP BY in Teradata verwenden. Die Antwortmenge ist die gleiche.

Aus Sicht der Leistung ist es nicht dasselbe.

Um die Auswirkungen auf die Leistung zu verstehen, müssen Sie wissen, was auf Teradata passiert, wenn eine Anweisung mit DISTINCT oder GROUP BY ausgeführt wird.

Im Falle von DISTINCT werden die Zeilen sofort neu verteilt, ohne dass eine Voraggregation stattfindet, während im Falle von GROUP BY in einem ersten Schritt eine Voraggregation durchgeführt wird und erst dann die eindeutigen Werte auf die AMPs verteilt werden.

Glauben Sie jetzt nicht, dass GROUP BY immer besser ist, wenn es um die Leistung geht. Wenn Sie viele verschiedene Werte haben, ist der Voraggregationsschritt von GROUP BY nicht sehr effizient. Teradata muss die Daten sortieren, um Duplikate zu entfernen. In diesem Fall ist es möglicherweise besser, zuerst die Umverteilung vorzunehmen, d. h. die DISTINCT-Anweisung zu verwenden. Nur wenn es viele doppelte Werte gibt, ist die GROUP BY-Anweisung wahrscheinlich die bessere Wahl, da der Deduplizierungsschritt erst nach der Umverteilung stattfindet.

Kurz gesagt, DISTINCT vs. GROUP BY in Teradata bedeutet:

GROUP BY -> für viele Duplikate DISTINCT -> keine oder nur wenige Duplikate . Bei der Verwendung von DISTINCT kann es vorkommen, dass der Spool-Speicherplatz auf einem AMP nicht mehr ausreicht. Der Grund dafür ist, dass die Neuverteilung sofort erfolgt und die Schieflage dazu führen kann, dass der Platz auf den AMPs knapp wird.

In diesem Fall haben Sie mit GROUP BY wahrscheinlich eine bessere Chance, da Duplikate bereits in einem ersten Schritt entfernt werden und weniger Daten über die AMPs verschoben werden.

4voto

Hank Gay Punkte 67607

Sie haben eine unterschiedliche Semantik, auch wenn sie bei Ihren speziellen Daten gleichwertige Ergebnisse liefern.

4voto

Danimal Punkte 7510

Gruppieren nach wird bei Aggregatoperationen verwendet - z. B. wenn Sie eine Zählung von Bs aufgeschlüsselt nach Spalte C erhalten möchten

select C, count(B) from myTbl group by C

distinct ist das, wonach es sich anhört - Sie erhalten eindeutige Zeilen.

In Sql Server 2005 sieht es so aus, als ob der Query Optimizer in der Lage ist, den Unterschied in den einfachen Beispielen, die ich ausgeführt habe, weg zu optimieren. Ich weiß aber nicht, ob Sie sich in allen Situationen darauf verlassen können.

4voto

Andy Lester Punkte 86147

Bitte verwenden Sie nicht GROUP BY, wenn Sie DISTINCT meinen, auch wenn sie zufällig gleich funktionieren. Ich gehe davon aus, dass Sie versuchen, bei den Abfragen Millisekunden einzusparen, und ich muss darauf hinweisen, dass die Entwicklungszeit um Größenordnungen teurer ist als die Computerzeit.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X