Как происходит порядок SQL Server при использовании объединений?

10

Как SQL Server определяет порядок записей в наборе результатов выполнения запроса?

Я пытаюсь сделать из этого головы или хвосты, но я почесываю голову. Когда я меняю поля, я выбираю порядок, также меняется. Когда я выполняю приведенный ниже SQL с, 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'
kacalapy
источник
6
Пара комментариев / вопросов: (1) зачем использовать волшебную пикси-пыль с турбо-кнопкой NOLOCK только на одном столе? Рассматривали ли вы использовать RCSI вместо вуду? (2) почему вы не используете правильные префиксы схемы? Для первого поиска в Интернете NOLOCK- вы увидите все виды причин, почему вы не должны его использовать. Для последнего см. Sqlblog.com/blogs/aaron_bertrand/archive/2009/10/11/…
Аарон Бертран
RCSI? пожалуйста, объясните ...
kacalapy
2
RCSI = чтение фиксации моментального снимка. См. Stackoverflow.com/questions/816650/…
Аарон Бертран
Без ORDER BYпредложения SQL Server (и любая другая СУБД) делает все, что угодно .
Ник Чаммас

Ответы:

17

Поскольку вы не указали SQL Server, как упорядочивать результаты, вы можете делать это в любом удобном для вас месте. Таким образом, это будет зависеть от того, что является самым дешевым для сортировки, и выбранные вами столбцы будут управлять этим, потому что это, в свою очередь, зависит от самого дешевого индекса (ов), который нужно использовать для получения информации, запрашиваемой запросом. Это может меняться от выполнения к выполнению не только путем изменения текста запроса, но и с помощью таких вещей, как изменения данных, обновления статистики, freeproccache, пакеты обновления, исправления и т. Д. Это особенно нестабильно при использовании большого количества таблиц, если базовые данные быстро меняются , как это обычно бывает в приложениях OLTP.

Если вам нужен предсказуемый порядок, почему вы не используете его ORDER BYв запросе? Как написано, SQL указывает, что любые 900 строк являются приемлемыми в любом порядке.

Несмотря на то, что во многих случаях вы видите один и тот же порядок снова и снова для одного и того же запроса, никакой гарантии нет, если вы не скажете ORDER BY <something>.

Аарон Бертран
источник