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'
sql-server
order-by
Kakalapy
quelle
quelle
NOLOCK
Sie 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/…ORDER BY
Klausel macht SQL Server (und jedes andere RDBMS), wie es sich anfühlt .Antworten:
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 BY
fü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>
.quelle