9 Stimmen

Wie entscheiden Datenbankserver, in welcher Reihenfolge sie die Zeilen zurückgeben, ohne dass es "order by"-Anweisungen gibt?

Das ist eine etwas skurrile Frage, über die ich mich schon immer gewundert habe, und ich dachte mir, wenn ich wüsste, warum sie das tut, was sie tut, könnte ich sie vielleicht etwas besser verstehen.

Nehmen wir an, ich gebe "SELECT TOP 10 * FROM Tabellenname" ein. In kurzen Zeitabständen kommen dieselben 10 Zeilen zurück, es scheint also nicht zufällig zu sein. Sie waren weder die ersten noch die letzten, die erstellt wurden. In meiner riesigen Stichprobengröße von... einer Tabelle wird nicht der minimale oder maximale automatisch inkrementierende Primärschlüsselwert zurückgegeben.

Ich denke auch, dass das Problem komplexer wird, wenn man die Verbindungen berücksichtigt.

Meine bevorzugte Datenbank ist MSSQL, aber ich denke, dass dies unabhängig von der Plattform eine interessante Frage sein könnte.

12voto

LBushkin Punkte 124894

Wenn Sie bei einer SELECT-Anweisung keine ORDER BY-Klausel angeben, erhalten Sie Zeilen in beliebiger Reihenfolge zurück.

Die tatsächliche Reihenfolge ist undefiniert und hängt davon ab, welche Blöcke/Datensätze bereits im Speicher zwischengespeichert sind, in welcher Reihenfolge E/A durchgeführt wird, wann Threads im Datenbankserver für die Ausführung geplant sind usw.

Es gibt keinen Grund für die Reihenfolge, und Sie sollten niemals Erwartungen an die Reihenfolge der Zeilen knüpfen, es sei denn, Sie geben ein ORDER BY an.

6voto

SqlRyan Punkte 31999

Wenn sie nicht durch die aufrufende Abfrage geordnet sind, werden sie meines Erachtens einfach in der Reihenfolge zurückgegeben, in der sie von der Festplatte gelesen wurden. Dies kann aufgrund der Art der verwendeten Verknüpfungen oder der Indizes, die die Werte nachschlagen, variieren.

Sie können dies sehen, wenn die Tabelle einen geclusterten Index hat (und Sie nur auswählen - ein JOIN kann die Dinge neu ordnen) - ein SELECT wird die Zeilen in der Reihenfolge des geclusterten Index zurückgeben, auch ohne eine ORDER BY-Klausel.

3voto

brenbart Punkte 71

Eine sehr ausführliche Erklärung mit Beispielen gibt es hier: http://sqlserverpedia.com/blog/sql-server-bloggers/its-the-natural-order-of-things-not/

1voto

Erwin Smout Punkte 17535

"Wie entscheiden Datenbankserver, in welcher Reihenfolge sie Zeilen zurückgeben, ohne dass es "order by"-Anweisungen gibt?"

Sie treffen einfach keine "Entscheidung" in Bezug auf die Bestellung. Sie sehen, dass der Nutzer sich nicht um die Bestellung kümmert, und deshalb ist es ihnen auch egal. Und so gehen sie einfach los, um die gewünschten Zeilen zu finden. Die Reihenfolge, in der sie sie finden, ist normalerweise die Reihenfolge, in der Sie sie bekommen. Diese Reihenfolge hängt von Dingen ab, die der Benutzer nicht vorhersagen kann, wie die gewählten physischen Zugriffspfade, die Reihenfolge der physischen Datensätze in den physischen Dateien der Datenbank usw. usw.

Lassen Sie sich nicht von der Reihenfolge täuschen, die Sie erhalten, wenn Sie in Ihrer Abfrage nicht ausdrücklich eine Reihenfolge angegeben haben. Wenn Sie in Ihrer Abfrage keine Reihenfolge angeben, ist keine Reihenfolge in der Ergebnismenge garantiert, auch wenn die Ergebnisse in der Praxis den Eindruck erwecken, dass der Server eine gewisse Reihenfolge einzuhalten scheint.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X