Wie ordnet SQL Server die Ergebnisse an, wenn Verknüpfungen verwendet werden?

10

Wie ermittelt SQL Server die Reihenfolge der Datensätze in der Ergebnismenge der Abfrageausführung?

Ich versuche, Kopf oder Zahl daraus zu machen, aber ich kratzte mir am Kopf. Wenn ich die Felder ändere, wähle ich die Reihenfolge aus, die sich ebenfalls ändert. Wenn ich die folgende SQL mit a ausführe, SELECT *erhalte ich dieselben Datensätze, jedoch in einer ganz anderen Reihenfolge.

 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'
Kakalapy
quelle
6
Ein paar Kommentare / Fragen: (1) Warum sollte man den magischen Pixie-Dust-Turboknopf NOLOCK nur an einem Tisch verwenden? Haben Sie darüber nachgedacht, RCSI anstelle von Voodoo zu verwenden? (2) Warum verwenden Sie nicht die richtigen Schema-Präfixe? Suchen NOLOCKSie im ersten Fall im Internet nach - Sie werden alle möglichen Gründe sehen, warum Sie es nicht verwenden sollten. Für letzteres siehe sqlblog.com/blogs/aaron_bertrand/archive/2009/10/11/…
Aaron Bertrand
RCSI? Bitte erklären Sie ...
Kacalapy
2
RCSI = Read Committed Snapshot Isolation. Siehe stackoverflow.com/questions/816650/…
Aaron Bertrand
Ohne eine ORDER BYKlausel macht SQL Server (und jedes andere RDBMS), wie es sich anfühlt .
Nick Chammas

Antworten:

17

Da Sie SQL Server nicht mitgeteilt haben, wie die Ergebnisse bestellt werden sollen, können Sie dies auf die effizienteste Weise tun. Auf diese Weise hängt es davon ab, welche am billigsten zu sortieren ist, und die von Ihnen ausgewählten Spalten bestimmen dies, da dies wiederum von den billigsten Indizes abhängt, die verwendet werden, um an die von der Abfrage angeforderten Informationen zu gelangen. Dies kann sich von Ausführung zu Ausführung ändern, nicht nur durch Ändern des Abfragetextes, sondern auch durch Datenänderungen, Statistikaktualisierungen, Freeproccache, Service Packs, Hotfixes usw. Dies ist besonders bei so vielen beteiligten Tabellen volatil, wenn sich die zugrunde liegenden Daten schnell ändern , wie es in OLTP-Anwendungen der Fall ist.

Wenn Sie eine vorhersehbare Reihenfolge wünschen, warum verwenden Sie sie nicht ORDER BYfür die Abfrage? Wie geschrieben, gibt SQL an, dass 900 Zeilen in beliebiger Reihenfolge zulässig sind.

Obwohl in vielen Fällen immer wieder dieselbe Reihenfolge für dieselbe Abfrage angezeigt wird, gibt es keine Garantie, es sei denn, Sie sagen ORDER BY <something>.

Aaron Bertrand
quelle