Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Die Reihenfolge einer SQL Select-Anweisung ohne Order By-Klausel

Nein, auf dieses Verhalten kann man sich nicht verlassen. Die Reihenfolge wird dadurch bestimmt, wie der Abfrageplaner entschieden hat, die Ergebnismenge aufzubauen. einfache Abfragen wie select * from foo_table werden wahrscheinlich in der Reihenfolge zurückgegeben, in der sie auf der Festplatte gespeichert sind, die in der Reihenfolge der Primärschlüssel oder in der Reihenfolge, in der sie erstellt wurden, oder in einer anderen zufälligen Reihenfolge sein kann. komplexere Abfragen wie select * from foo where bar < 10 kann stattdessen in der Reihenfolge einer anderen Spalte basierend auf einem Index-Lesevorgang oder in der Tabellenreihenfolge für einen Tabellenscan zurückgegeben werden. noch ausgefeiltere Abfragen mit mehreren where Bedingungen, group by Klauseln, union s, in der Reihenfolge, die nach Ansicht des Planers am effizientesten zu generieren ist.

Die Reihenfolge könnte sich sogar zwischen zwei identischen Abfragen ändern, nur weil sich Daten zwischen diesen Abfragen geändert haben. eine "where"-Klausel kann mit einem Index-Scan in einer Abfrage erfüllt werden, aber spätere Einfügungen könnten diese Bedingung weniger selektiv machen, und der Planer könnte entscheiden, eine nachfolgende Abfrage mit einem Tabellen-Scan durchzuführen.

Um es genauer auszudrücken. RDBMS-Systeme haben den Auftrag, Ihnen genau zu geben das, wonach Sie gefragt haben, so effizient wie möglich. Diese Effizienz kann viele Formen annehmen, einschließlich der Minimierung von E/A (sowohl auf die Festplatte als auch über das Netzwerk, um Daten an Sie zu senden), der Minimierung der CPU und der Minimierung der Größe des Arbeitssatzes (mit Methoden, die nur minimalen temporären Speicher erfordern). P>

ohne ORDER BY Klausel, haben Sie nicht genau gefragt für eine bestimmte Reihenfolge, und so gibt Ihnen das RDBMS diese Zeilen in einer Reihenfolge, die (vielleicht) einem zufälligen Aspekt der Abfrage entspricht, basierend auf dem Algorithmus, den das RDBMS erwartet, um die Daten am schnellsten zu produzieren.

Wenn Sie Wert auf Effizienz, aber nicht auf Reihenfolge legen, überspringen Sie ORDER BY Klausel. Wenn Ihnen die Reihenfolge wichtig ist, aber nicht die Effizienz, verwenden Sie den ORDER BY Klausel.

Da Ihnen eigentlich beides wichtig ist Verwenden Sie ORDER BY und optimieren Sie dann Ihre Abfrage und Datenbank sorgfältig, damit sie effizient sind.