Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Защо SQL Server 2008 подрежда, когато използва GROUP BY и не е посочен ред?

За да отговорите на този въпрос, погледнете плановете за заявки, създадени от двамата.

Първият SELECT е просто сканиране на таблица, което означава, че произвежда редове в реда на разпределение. Тъй като това е нова таблица, тя съответства на реда, в който сте въвели записите.

Вторият SELECT добавя GROUP BY, който SQL Server прилага чрез отделно сортиране, тъй като изчисленият брой редове е толкова нисък. Ако трябваше да имате повече редове или да добавите агрегат към вашия SELECT, този оператор може да се промени.

Например опитайте:

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

Поради броя на редовете това се променя в хеш агрегат и сега няма сортиране в плана на заявката.

Без ORDER BY SQL Server може да върне резултатите във всякакъв ред, а редът, в който се връща, е страничен ефект от начина, по който смята, че може най-бързо да върне данните.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Търся програма за преглед на файлове за SQL Transaction Log file

  2. Проблем със закръгляването във функциите LOG и EXP

  3. Какво прави sp_reset_connection?

  4. Как да добавя часове към текущата дата в SQL Server?

  5. SQL грешка:„CREATE/ALTER PROCEDURE“ трябва да бъде първият израз в пакета на заявката