Як SQL Server замовляє результати при використанні об'єднань?


10

Як SQL Server визначає порядок записів у наборі результатів виконання запитів?

Я намагаюся зробити з нього голови чи хвости, але я почуваю, що я дряпаю голову. Коли я змінюю поля, я вибираю порядок, також змінюється. Коли я виконую нижче SQL з a, SELECT *я отримую ті ж записи, але в набагато іншому порядку.

 SELECT TOP (900)
    AD.ATTACHMENTID,
    AD.NAME,
    AD.ISINLINE,
    AD.INSERTEDDATETIME,
    ATMT.ATTACHMENTBLOB,
    U.UFID
  FROM ATTACHMENTDETAIL AD WITH (NOLOCK)
  INNER JOIN MESSAGEATTACHMENT MA ON MA.ATTACHMENTID = AD.ATTACHMENTID
  INNER JOIN ATTACHMENT ATMT ON ATMT.ATTACHMENTID = AD.ATTACHMENTID
  INNER JOIN MESSAGE MSG ON MSG.ID = MA.MESSAGEID
  INNER JOIN MESSAGEDETAIL MD ON MD.MESSAGEID = MA.MESSAGEID
  INNER JOIN [USER] U ON U.ID = MD.USERID
  LEFT OUTER JOIN XmlExtractionMapping XM ON MA.MESSAGEID = XM.MessageId
    WHERE AD.FILEBOXTOKEN IS NULL 
    AND (XM.XMLEXTRACTIONDATE IS NOT NULL OR 
         (MSG.MESSAGESOURCEID = 1 AND MD.FolderId <> -4))
    AND AD.ISINLINE = 'FALSE'

6
Кілька коментарів / питань: (1) навіщо використовувати чарівну піксі-пилову турбо кнопку NOLOCK лише на одному столі? Чи думали ви використовувати RCSI замість вуду? (2) чому ви не використовуєте належних префіксів схеми? Для перших пошукайте в Інтернеті NOLOCK- ви побачите всілякі причини, чому вам не слід користуватися ним. Про останнє див. Sqlblog.com/blogs/aaron_bertrand/archive/2009/10/11/…
Aaron Bertrand

RCSI? поясніть, будь ласка, ...
kacalapy

2
RCSI = Прочитати виділену знімку знімка. Дивіться stackoverflow.com/questions/816650/…
Аарон Бертран

Без ORDER BYзастережень, SQL Server (і будь-який інший RDBMS) робить все, що вам здається .
Нік Чаммас

Відповіді:


17

Оскільки ви не сказали SQL Server, як замовити результати, це можна зробити в будь-якому, що є найбільш ефективним. Таким чином, це залежатиме від того, що найдешевше сортувати, а вибрані стовпці визначатимуть це, оскільки це, в свою чергу, залежить від найдешевших індексів, які потрібно використовувати, щоб отримати інформацію, яку вимагає запит. Це може змінитись від виконання до виконання не лише зміною тексту запиту, але й такими речами, як зміни даних, оновлення статистики, freeproccache, пакети послуг, виправлення тощо. Це особливо непостійно, якщо задіяно стільки таблиць, якщо основні дані швидко змінюються. , як це робиться в OLTP-програмах.

Якщо ви хочете передбачити замовлення, чому б вам не скористатись ORDER BYзапитом? Як написано, SQL визначає, що будь-які 900 рядків є прийнятними в будь-якому порядку.

Незважаючи на те, що в багатьох випадках ви бачите одне і те ж замовлення знову і знову за одним і тим же запитом, гарантії немає, якщо ви не скажете ORDER BY <something>.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.