SQL Server 如何计算查询执行结果集中记录的顺序?
我试图对此做出正面或反面,但发现自己摸不着头脑。当我更改字段时,我选择的顺序也会更改。当我用 a 执行下面的 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 如何对结果进行排序,因此可以自由地以最有效的方式进行排序。通过这种方式,它将取决于最便宜的排序方式,并且您选择的列将驱动它,因为它又取决于用于获取查询请求的信息的最便宜的索引。这不仅可以通过更改查询文本,还可以通过数据更改、统计信息更新、freeproccache、服务包、修补程序等从执行到执行进行更改。如果基础数据快速更改,则涉及到如此多的表,这一点尤其不稳定,就像它在 OLTP 应用程序中经常发生的那样。
如果您想要一个可预测的顺序,为什么不在
ORDER BY
查询中使用?正如所写,SQL 指定任何900 行都是可接受的,以任何顺序。即使在很多情况下,对于同一个查询,您会一遍又一遍地看到相同的订单,除非您说
ORDER BY <something>
.