Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Por que o SQL Server 2008 ordena ao usar um GROUP BY e nenhum pedido foi especificado?


Para responder a essa pergunta, observe os planos de consulta produzidos por ambos.

O primeiro SELECT é uma varredura de tabela simples, o que significa que produz linhas em ordem de alocação. Como esta é uma nova tabela, ela corresponde à ordem em que você inseriu os registros.

O segundo SELECT adiciona um GROUP BY, que o SQL Server implementa por meio de uma classificação distinta, pois a contagem de linhas estimada é muito baixa. Se você tiver mais linhas ou adicionar um agregado ao seu SELECT, esse operador pode mudar.

Por exemplo, tente:
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

Devido ao número de linhas, isso se transforma em um agregado de hash e agora não há classificação no plano de consulta.

Sem ORDER BY, o SQL Server pode retornar os resultados em qualquer ordem, e a ordem em que ele volta é um efeito colateral de como ele acha que pode retornar os dados mais rapidamente.