Aby odpowiedzieć na to pytanie, spójrz na plany zapytań opracowane przez oba.
Pierwszy SELECT to proste skanowanie tabeli, co oznacza, że generuje wiersze w kolejności alokacji. Ponieważ jest to nowa tabela, pasuje do kolejności wstawiania rekordów.
Drugi SELECT dodaje GROUP BY, które SQL Server implementuje za pomocą odrębnego sortowania, ponieważ szacowana liczba wierszy jest tak niska. Jeśli chcesz mieć więcej wierszy lub dodać agregację do SELECT, ten operator może się zmienić.
Na przykład spróbuj:
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
Ze względu na liczbę wierszy zmienia się to w agregację hash i teraz nie ma sortowania w planie zapytania.
Bez ORDER BY, SQL Server może zwracać wyniki w dowolnej kolejności, a kolejność, w jakiej wraca, jest efektem ubocznym tego, jak jego zdaniem może najszybciej zwrócić dane.