Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Dlaczego SQL Server 2008 porządkuje, gdy używa się funkcji GROUP BY i nie określono kolejności?

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ogranicz połączenie SQL Server do określonego adresu IP

  2. Funkcje rankingowe w SQL Server

  3. Baza danych kopii zapasowych SQL Server Express | Jak zaplanować automatyzację i czyszczenie kopii zapasowej SQL Express

  4. SQL Server — PRZED WSTAWIENIEM wyzwalacza

  5. SELECT max(x) zwraca wartość null; jak mogę sprawić, żeby zwróciło 0?