sql >> Databáze >  >> RDS >> Sqlserver

Proč SQL Server 2008 objednává při použití GROUP BY a nebylo zadáno žádné pořadí?

Chcete-li odpovědět na tuto otázku, podívejte se na plány dotazů vytvořené oběma.

První SELECT je jednoduché prohledávání tabulky, což znamená, že vytváří řádky v pořadí přidělení. Protože se jedná o novou tabulku, odpovídá pořadí, ve kterém jste vložili záznamy.

Druhý SELECT přidá GROUP BY, které SQL Server implementuje prostřednictvím odlišného řazení, protože odhadovaný počet řádků je tak nízký. Pokud byste měli mít více řádků nebo přidat agregaci do SELECT, tento operátor se může změnit.

Zkuste například:

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

Kvůli počtu řádků se to změní na agregaci hash a v plánu dotazů nyní není žádné řazení.

Bez ORDER BY může SQL Server vrátit výsledky v libovolném pořadí a pořadí, ve kterém se vrátí, je vedlejším efektem toho, jak si myslí, že může nejrychleji vrátit data.



  1. Import CSV do MySQL s jiným formátem data

  2. Jaký je nejlepší způsob, jak načíst obrovské množství dat do PostgreSQL?

  3. převést řetězec na datum php

  4. vkládání více hodnot funguje v procedurách mysql?