結合を使用すると、SQL Serverはどのように結果を並べ替えますか?


10

SQL Serverは、クエリ実行の結果セット内のレコードの順序をどのように把握しますか?

頭や尻尾を作ろうとしているのですが、頭をひっかいています。フィールドを変更すると、選択する順序も変更されます。以下のSQLをaで実行すると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)なぜ1つのテーブルだけで魔法のピクシーダストターボボタンNOLOCKを使用するのですか?ブードゥー教の代わりにRCSIの使用を検討しましたか?(2)なぜ適切なスキーマ接頭辞を使用しないのですか?前者については、Webを検索してNOLOCKください。これを使用してはならない理由がさまざまに表示されます。後者については、sqlblog.com/blogs/aaron_bertrand/archive/2009/10/11/...
アーロン・ベルトラン

RCSI?説明してください...
kacalapy 2012年

2
RCSI = Read Committed Snapshot Isolation。stackoverflow.com/questions/816650/…を
アーロンバートランド

ORDER BY句がないと、SQL Server(およびその他のRDBMS)は、感じていることは何でも行います。
Nick Chammas

回答:


17

SQL Serverに結果の並べ替え方法を指示していないため、最も効率的な方法で自由に並べ替えることができます。このように、最も安価なソートに依存します。選択した列は、クエリによって要求された情報を取得するために使用する最も安価なインデックスに依存するため、これを促進します。これは、クエリテキストを変更するだけでなく、データの変更、統計の更新、freeproccache、サービスパック、修正プログラムなどによっても、実行ごとに変わる可能性があります。これは、基になるデータが急速に変化している場合、非常に多くのテーブルが関与するため特に不安定です。 OLTPアプリケーションで行われる傾向があるため。

予測可能な順序が必要な場合ORDER BYは、クエリで使用しないでください。記述されているように、SQLは900行が任意の順序で受け入れられることを指定しています。

多くの場合、同じクエリに対して同じ順序が何度も表示されますが、特に断らない限り、保証はありませんORDER BY <something>

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.