Ist die Reihenfolge der Spalten in einer Gruppe nach Klausel von Bedeutung?

85

Wenn ich zwei Spalten habe, eine mit sehr hoher Kardinalität und eine mit sehr niedriger Kardinalität (eindeutige Anzahl von Werten), spielt es dann eine Rolle, in welcher Reihenfolge ich gruppiere?

Hier ist ein Beispiel:

select 
     dimensionName, 
     dimensionCategory, 
     sum(someFact)
from SomeFact f
join SomeDim d on f.dimensionKey = d.dimensionKey
group by 
    d.dimensionName,  -- large number of unique values
    d.dimensionCategory -- small number of unique values

Gibt es Situationen, in denen es darauf ankommt?

Jeff Fleischbällchen Yang
quelle
2
Siehe auch verwandten Beitrag: MYSQL5 Reihenfolge der Gruppe von ...
trcarden

Antworten:

72

Nein, die Reihenfolge spielt für die GROUP BY-Klausel keine Rolle.

MySQL und SQLite sind die einzigen mir bekannten Datenbanken, mit denen Sie Spalten auswählen können, die in der Gruppe nicht aufgeführt sind (nicht standardmäßig, nicht portierbar), aber die Reihenfolge spielt dort auch keine Rolle.

OMG Ponys
quelle
27

SQL ist deklarativ.

In diesem Fall haben Sie dem Optimierer mitgeteilt, wie die Daten gruppiert werden sollen, und es wird herausgefunden, wie dies zu tun ist.

Es wird nicht zeilenweise (prozedural) ausgewertet und zuerst eine Spalte betrachtet

Die Hauptreihenfolge der Ortsspalten ist für Indizes. col1, col2ist nicht dasselbe wie col2, col1. Überhaupt.

gbn
quelle
14
Es ist auch wichtig für ORDER BY.
Vincent McNabb
12

Es gibt eine ältere, nicht standardmäßige Funktion von Microsoft SQL Server namens ROLLUP. ROLLUP ist eine Erweiterung der GROUP BY-Syntax. Bei Verwendung bestimmt die Reihenfolge der GROUP BY-Spalten, welche Spalten im Ergebnis gruppiert werden sollen. ROLLUP ist jedoch veraltet. Die Standard-SQL-Alternative ist die Verwendung von Gruppierungssätzen, die von SQL Server 2008 und späteren Versionen unterstützt werden.

nvogel
quelle
10

Da dies hier nicht erwähnt wurde. Die obigen Antworten sind korrekt, dh die Reihenfolge der Spalten nach der "group by" -Klausel hat keinen Einfluss auf die Richtigkeit der Abfrage (dh den Summenbetrag).

Die Reihenfolge der abgerufenen Zeilen hängt jedoch von der Reihenfolge der Spalten ab, die nach der Klausel "Gruppieren nach" angegeben sind. Betrachten Sie beispielsweise die Tabelle Amit den folgenden Zeilen:

Col1 Col2 Col3
1   xyz 100
2   abc 200
3   xyz 300
3   xyz 400

SELECT *, SUM(Col3) FROM A GROUP BY Col2, Col1ruft Zeilen ab, die Col2in aufsteigender Reihenfolge sortiert sind.

Col1 Col2 Col3 sum(Col3)
2   abc 200 200
1   xyz 100 100
3   xyz 300 700

Ändern Sie nun die Reihenfolge der Spalten in der Gruppe um in Col1, Col2. Die abgerufenen Zeilen sind aufsteigend sortiert nach Col1.

dh select *, sum(Col3) from A group by Col1, Col2

Col1 Col2 Col3 sum(Col3)
1   xyz 100 100
2   abc 200 200
3   xyz 300 700

Hinweis: Der Summierungsbetrag (dh die Richtigkeit der Abfrage) bleibt exakt gleich.

AaCodes
quelle
7
Aber wenn nicht "ORDER BY" verwendet wird, ist die Zeilenreihenfolge der ausgewählten Ergebnisse ohnehin undefiniert, nicht wahr? Sie sollten sich also niemals auf eine bestimmte Reihenfolge von Zeilen verlassen, auch wenn Sie GROUP BY überhaupt nicht verwenden.
avl_sweden
Ich stimme @avl_sweden zu und denke, dass die Antwort zumindest darauf hinweisen sollte, dass dieses Verhalten implementierungsspezifisch ist. Es gibt keine Garantie dafür, dass eine neuere (oder sogar dieselbe) Version von SQL Server keine andere Reihenfolge erzeugt.
NobodysNightmare
2

Wenn ich zwei Spalten habe, eine mit sehr hoher Kardinalität und eine mit sehr niedriger Kardinalität (eindeutige Anzahl von Werten), spielt es dann eine Rolle, in welcher Reihenfolge ich gruppiere?

Abfrage-1

SELECT spec_id, catid, spec_display_value, COUNT(*) AS cnt  FROM tbl_product_spec 
GROUP BY spec_id, catid, spec_display_value ;

Abfrage-2

SELECT spec_id, catid, spec_display_value, COUNT(*) AS cnt  FROM tbl_product_spec FORCE INDEX(idx_comp_spec_cnt)
GROUP BY catid, spec_id,spec_display_value;

Beide sind gleich, die Reihenfolge funktioniert nicht in der Klausel group by.

Gauravk
quelle