sql >> Database teknologi >  >> RDS >> Sqlserver

Hvorfor bestiller SQL Server 2008, når der bruges en GROUP BY, og der ikke er angivet nogen ordre?

For at besvare dette spørgsmål, se på forespørgselsplanerne produceret af begge.

Den første SELECT er en simpel tabelscanning, hvilket betyder, at den producerer rækker i allokeringsrækkefølge. Da dette er en ny tabel, svarer den til den rækkefølge, du indsatte posterne.

Den anden SELECT tilføjer en GROUP BY, som SQL Server implementerer via en særskilt sortering, da det estimerede antal rækker er så lavt. Hvis du skulle have flere rækker eller tilføje et aggregat til din SELECT, kan denne operator ændre sig.

Prøv f.eks.:

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

På grund af antallet af rækker ændres dette til et hashaggregat, og nu er der ingen sortering i forespørgselsplanen.

Uden ORDER BY kan SQL Server returnere resultaterne i en hvilken som helst rækkefølge, og den rækkefølge, den kommer tilbage i, er en bivirkning af, hvordan den tror, ​​den hurtigst kan returnere dataene.



  1. Anmodningen sendt af klienten var syntaktisk forkert ved brug af @DateTimeFormat

  2. Vis SQLite-forespørgselsresultater ved hjælp af lodret output

  3. Dynamisk oprettelse af ELLER-betingelser ved at sende et array til en forespørgsel i MySQL PHP

  4. Find det nærmeste punkt i Pandas DataFrames