Как 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'
sql-server
order-by
kacalapy
источник
источник
NOLOCK
- вы увидите все виды причин, почему вы не должны его использовать. Для последнего см. Sqlblog.com/blogs/aaron_bertrand/archive/2009/10/11/…ORDER BY
предложения SQL Server (и любая другая СУБД) делает все, что угодно .Ответы:
Поскольку вы не указали SQL Server, как упорядочивать результаты, вы можете делать это в любом удобном для вас месте. Таким образом, это будет зависеть от того, что является самым дешевым для сортировки, и выбранные вами столбцы будут управлять этим, потому что это, в свою очередь, зависит от самого дешевого индекса (ов), который нужно использовать для получения информации, запрашиваемой запросом. Это может меняться от выполнения к выполнению не только путем изменения текста запроса, но и с помощью таких вещей, как изменения данных, обновления статистики, freeproccache, пакеты обновления, исправления и т. Д. Это особенно нестабильно при использовании большого количества таблиц, если базовые данные быстро меняются , как это обычно бывает в приложениях OLTP.
Если вам нужен предсказуемый порядок, почему вы не используете его
ORDER BY
в запросе? Как написано, SQL указывает, что любые 900 строк являются приемлемыми в любом порядке.Несмотря на то, что во многих случаях вы видите один и тот же порядок снова и снова для одного и того же запроса, никакой гарантии нет, если вы не скажете
ORDER BY <something>
.источник