sql >> Database >  >> RDS >> Sqlserver

Waarom bestelt SQL Server 2008 bij gebruik van een GROUP BY en is er geen volgorde opgegeven?

Om deze vraag te beantwoorden, kijk naar de queryplannen die door beide zijn gemaakt.

De eerste SELECT is een eenvoudige tabelscan, wat betekent dat het rijen in toewijzingsvolgorde produceert. Aangezien dit een nieuwe tabel is, komt deze overeen met de volgorde waarin u de records hebt ingevoegd.

De tweede SELECT voegt een GROUP BY toe, die SQL Server implementeert via een aparte sortering, aangezien het geschatte aantal rijen zo laag is. Als u meer rijen zou hebben of een aggregaat aan uw SELECT zou toevoegen, kan deze operator veranderen.

Probeer bijvoorbeeld:

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

Vanwege het aantal rijen verandert dit in een hash-aggregaat en is er nu geen sortering in het queryplan.

Zonder ORDER BY kan SQL Server de resultaten in elke volgorde retourneren, en de volgorde waarin het terugkomt, is een neveneffect van hoe het denkt de gegevens het snelst te kunnen retourneren.



  1. Hoe gegevens uit een andere tabel te halen met behulp van kolomgegevens uit een andere tabel?

  2. Oracle krijgt checksum-waarde voor een gegevensblok gedefinieerd door een select-clausule

  3. Tabel1 bijwerken Van tabel 2

  4. Snelste controle of rij bestaat in PostgreSQL