sql >> Databasteknik >  >> RDS >> Sqlserver

Varför ordnar SQL Server 2008 när man använder en GROUP BY och ingen order har angetts?

För att svara på den här frågan, titta på frågeplanerna som produceras av båda.

Den första SELECT är en enkel tabellskanning, vilket innebär att den producerar rader i allokeringsordning. Eftersom det här är en ny tabell matchar den den ordning du infogade posterna.

Den andra SELECT lägger till en GROUP BY, som SQL Server implementerar via en distinkt sortering eftersom det uppskattade radantalet är så lågt. Om du skulle ha fler rader eller lägga till ett aggregat i ditt SELECT, kan denna operator ändras.

Försök till exempel:

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 av antalet rader ändras detta till ett hashaggregat, och nu finns det ingen sortering i frågeplanen.

Utan ORDER BY kan SQL Server returnera resultaten i valfri ordning, och ordningen den kommer tillbaka i är en bieffekt av hur den tror att den snabbast kan returnera data.



  1. Kan du inte infoga en ny rad i postgres databastabell?

  2. MySQL Behöver hjälp med att konstruera fråga:slå samman flera tabeller i en rad

  3. Parallel Go-tester utförda mot en PostgreSQL-databas som körs på Docker

  4. PHP &MySQL - Hur man visar valt värde på rullgardinsmenyn