使用连接时,SQL Server 如何对结果进行排序?

kac*_*apy 10 sql-server order-by

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'
Run Code Online (Sandbox Code Playgroud)

Aar*_*and 18

由于您还没有告诉 SQL Server 如何对结果进行排序,因此可以自由地以最有效的方式进行排序。通过这种方式,它将取决于排序最便宜的内容,并且您选择的列将推动排序,因为它反过来取决于用于获取查询请求的信息的最便宜的索引。这不仅可以通过更改查询文本,还可以通过数据更改、统计更新、freeproccache、服务包、修补程序等在执行之间更改。如果基础数据快速更改,这对于涉及这么多表的情况尤其不稳定,就像它在 OLTP 应用程序中所做的那样。

如果您想要一个可预测的顺序,为什么不在ORDER BY查询中使用?正如所写,SQL 指定任何900 行都是可接受的,任何顺序。

即使在很多情况下,您会一遍又一遍地看到相同查询的相同顺序,除非您说 ,否则无法保证ORDER BY <something>