In diesem Fall bin ich mir sicher, dass der Optimizer entschieden hat, einen vollständigen Tabellenscan oder Nonclustered-Index-Scan durchzuführen, da er sehr klein ist. Sie können die tatsächlichen Ausführungsplan enthalten und sehen:
Sie können gruppierten Index erzwingen zu verwenden:
SELECT * FROM TRIAL WITH (INDEX(UNQ))
Und Sie wahrscheinlich erhalten wird:
und Ergebnismenge:
Id Name
1 a
5 b
2 c
3 d
Aber Sie sollten das nicht wirklich tun, da die Bestellung immer noch nicht garantiert ist. Wenn Sie möchten, dass Ihre Ergebnisse nach Spalten sortiert werden, tun Sie dies explizit!
Ich werde ein Fragment aus dem Buch kopieren Exam 70-461: Querying Microsoft SQL Server 2012
, wo man einige gute Erklärung bekommen:
Es ist wie die Ausgabe von empid sortiert erscheinen mag, aber das ist nicht garantiert. Was verwirrender sein könnte ist, dass wenn Sie die Abfrage wiederholt ausführen, scheint es, als ob das Ergebnis in der gleichen Reihenfolge zurückgegeben wird; aber auch das ist nicht garantiert. Wenn das Datenbankmodul (in diesem Fall SQL Server ) diese Abfrage verarbeitet, weiß es, dass es die Daten in beliebiger Reihenfolge zurückgeben kann, da keine explizite Anweisung an die Daten in einer bestimmten Reihenfolge zurückgibt.Es könnte sein, dass aufgrund von Optimierung und anderen Gründen die SQL Server-Datenbank-Engine auswählt, um die Daten in einer bestimmten Weise dieses Mal zu verarbeiten. Es gibt sogar einige Wahrscheinlichkeit, dass solche Entscheidungen wiederholt werden, wenn die physikalischen Umstände gleich bleiben. Aber es gibt einen großen Unterschied zwischen , was wahrscheinlich aufgrund von Optimierung und anderen Gründen passieren wird und was tatsächlich garantiert ist.
Die Datenbank-Engine kann - und manchmal auch - die Auswahl ändern, die sich auf die Reihenfolge auswirken kann, in der die Zeilen zurückgegeben werden, in dem Wissen, dass es dazu frei ist. Beispiele für solche Änderungen in Auswahlmöglichkeiten sind Änderungen in der Datenverteilung, Verfügbarkeit von physischen Strukturen wie Indizes und Verfügbarkeit von Ressourcen wie CPUs und Speicher. Auch bei Änderungen in der Engine nach einem Upgrade auf eine neuere Version des Produkts oder sogar nach Anwendung eines Service Packs können sich die Optimierungsaspekte ändern. Solche Änderungen können wiederum unter anderem die Reihenfolge der Zeilen im Ergebnis beeinflussen.
Kurz gesagt, dies kann nicht genug betont werden: Eine Abfrage, die nicht tut eine explizite Anweisung hat die Zeilen in einer bestimmten Reihenfolge zurückzukehren nicht die Reihenfolge der Zeilen in dem Ergebnis garantiert . Wenn Sie eine solche Garantie benötigen, ist die einzige Möglichkeit, es bereitzustellen, indem Sie der Abfrage eine ORDER BY -Klausel hinzufügen, und das ist der Fokus des nächsten Abschnitts.
EDIT basierend auf Kommentare:
Die Sache ist, dass selbst wenn Sie Clustered-Index verwenden, es ungeordnete Menge zurückkehren. Angenommen, Sie haben eine geordnete Reihenfolge der Clusterschlüssel wie (1, 2, 3, 4, 5)
. Die meiste Zeit werden Sie (1, 2, 3, 4, 5)
erhalten, aber es kann Situationen geben, in denen sich der Optimierer dazu entschließt, parallel zu lesen und sagen, es hat 2 parallele Lesevorgänge und es liest (1, 2, 3)
und (4, 5)
. Nun kann es vorkommen, dass (4, 5)
zuerst zurückgegeben wird und dann (1, 2, 3)
zurückgegeben werden kann. Wenn Sie keine order by
Klausel-Engine haben, werden ihre Ressourcen nicht damit verbracht, diesen Satz zu bestellen, und Sie erhalten (4, 5, 1, 2, 3)
. Das erklärt, warum Sie immer sicherstellen sollten, dass Sie order by
Klausel haben, wenn Sie bestellen möchten.
Markieren Sie die verwendeten DBMS. (Indizes sind immer mehr oder weniger produktspezifisch.) – jarlh
MS sql 2014 Entwickler Edition – Sagar
Lesen Sie diesen Artikel zum Thema. https://blogs.msdn.microsoft.com/conor_cunningham_msft/2008/08/27/no-seatbelt-expecting-order-without-order-by/ –