sql >> Base de Datos >  >> RDS >> Sqlserver

¿Por qué SQL Server 2008 ordena cuando usa un GROUP BY y no se ha especificado ningún orden?

Para responder a esta pregunta, mire los planes de consulta producidos por ambos.

El primer SELECT es un escaneo de tabla simple, lo que significa que produce filas en orden de asignación. Dado que esta es una tabla nueva, coincide con el orden en que insertó los registros.

El segundo SELECT agrega un GROUP BY, que SQL Server implementa a través de una ordenación distinta ya que el recuento de filas estimado es muy bajo. Si tuviera más filas o agregara un agregado a su SELECT, este operador podría cambiar.

Por ejemplo, intente:

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

Debido a la cantidad de filas, esto se convierte en un agregado hash y ahora no hay ordenación en el plan de consulta.

Sin ORDER BY, SQL Server puede devolver los resultados en cualquier orden, y el orden en que regresa es un efecto secundario de cómo cree que puede devolver los datos más rápidamente.