使用联接时,SQL Server的订购结果如何?


10

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'

6
几个评论/问题:(1)为什么仅在一张桌子上使用魔术小尘推涡轮按钮NOLOCK?您是否考虑过使用RCSI代替voodoo?(2)为什么不使用适当的架构前缀?对于前者,请在网上搜索NOLOCK-您会看到各种不使用它的原因。对于后者,请参见sqlblog.com/blogs/aaron_bertrand/archive/2009/10/11/…–
亚伦·伯特兰

RCSI?请解释...
kacalapy 2012年

2
RCSI =读取提交的快照隔离。见stackoverflow.com/questions/816650/...
阿龙贝特朗

如果没有ORDER BY子句,SQL Server(和任何其他RDBMS)将执行任何操作
Nick Chammas 2012年

Answers:


17

由于您没有告诉SQL Server如何排序结果,因此可以以最有效的方式免费这样做。通过这种方式,它将取决于最便宜的排序方式,而您选择的列将推动这种情况,因为它反过来取决于用来获取查询请求的信息的最便宜的索引。不仅可以通过更改查询文本,还可以通过数据更改,统计信息更新,freeproccache,Service Pack,修补程序等更改从执行到执行的变化。如果基础数据在快速变化,则涉及的表如此之多尤其易变,因为它倾向于在OLTP应用程序中使用。

如果您想要可预测的订单,为什么不在ORDER BY查询中使用?如所写,SQL指定可接受的任何 900行(以任何顺序)。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.