Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Warum sortiert SQL Server 2008, wenn GROUP BY verwendet wird und keine Reihenfolge angegeben wurde?

Sehen Sie sich zur Beantwortung dieser Frage die von beiden erstellten Abfragepläne an.

Das erste SELECT ist ein einfacher Tabellenscan, was bedeutet, dass es Zeilen in Zuordnungsreihenfolge erzeugt. Da dies eine neue Tabelle ist, stimmt sie mit der Reihenfolge überein, in der Sie die Datensätze eingefügt haben.

Das zweite SELECT fügt ein GROUP BY hinzu, das SQL Server über eine eindeutige Sortierung implementiert, da die geschätzte Zeilenanzahl so niedrig ist. Wenn Sie mehr Zeilen haben oder Ihrem SELECT ein Aggregat hinzufügen, kann sich dieser Operator ändern.

Versuchen Sie es beispielsweise mit:

CREATE TABLE #Values ( FieldValue varchar(50) )

;WITH FieldValues AS
(
    SELECT '4' FieldValue UNION ALL
    SELECT '3' FieldValue UNION ALL
    SELECT '2' FieldValue UNION ALL
    SELECT '1' FieldValue
)
INSERT INTO #Values ( FieldValue )
SELECT
    A.FieldValue
FROM FieldValues A
CROSS JOIN FieldValues B
CROSS JOIN FieldValues C
CROSS JOIN FieldValues D
CROSS JOIN FieldValues E
CROSS JOIN FieldValues F

SELECT
    FieldValue
FROM #Values
GROUP BY
    FieldValue

DROP TABLE #Values

Aufgrund der Anzahl der Zeilen wird dies zu einem Hash-Aggregat, und jetzt gibt es keine Sortierung im Abfrageplan.

Ohne ORDER BY kann SQL Server die Ergebnisse in beliebiger Reihenfolge zurückgeben, und die Reihenfolge, in der es zurückkommt, ist ein Nebeneffekt dessen, wie es denkt, dass es die Daten am schnellsten zurückgeben kann.