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?
sql
sql-server
group-by
Jeff Fleischbällchen Yang
quelle
quelle
Antworten:
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.
quelle
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, col2
ist nicht dasselbe wiecol2, col1
. Überhaupt.quelle
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.
quelle
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
A
mit den folgenden Zeilen:SELECT *, SUM(Col3) FROM A GROUP BY Col2, Col1
ruft Zeilen ab, dieCol2
in aufsteigender Reihenfolge sortiert sind.Ändern Sie nun die Reihenfolge der Spalten in der Gruppe um in
Col1, Col2
. Die abgerufenen Zeilen sind aufsteigend sortiert nachCol1
.dh
select *, sum(Col3) from A group by Col1, Col2
Hinweis: Der Summierungsbetrag (dh die Richtigkeit der Abfrage) bleibt exakt gleich.
quelle
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
Abfrage-2
Beide sind gleich, die Reihenfolge funktioniert nicht in der Klausel group by.
quelle