Ich habe SQL selten bis vor kurzem verwendet, als ich es täglich benutzte. Ich stelle fest, dass wenn keine "Order by" -Klausel verwendet wird:
Ist dieses Verhalten ein Standard, auf den man sich in den gebräuchlichsten Datenbanken verlassen kann (MySql, Oracle, PostgreSQL, Sqlite, Sql Server)? (Ich weiß nicht wirklich, ob man wirklich darauf zählen kann). Wie streng wird es geehrt, wenn das so ist (z.B. wenn man "Gruppe für" verwendet, hätten die einzelnen Gruppen jeweils diese Reihenfolge)?
Abschnitt 20.2 & lt; direkte Auswahlanweisung: mehrere Zeilen & gt;, Unterabschnitt "Allgemeine Regeln" von die SQL-92-Spezifikation :
%Vor%
Wenn in der Abfrage keine ORDER BY-Klausel enthalten ist, ist die zurückgegebene Reihenfolge der Zeilen nicht definiert.
Während einige RDBMS in bestimmten Situationen Zeilen in bestimmten Reihenfolgen zurückgeben, selbst wenn eine ORDER BY-Klausel weggelassen wird, sollte sich ein solches Verhalten niemals als zuverlässig erweisen.
Wenn Sie bestellen möchten, fügen Sie ein ORDER BY
ein. Wenn Sie kein ORDER BY
angeben, sagen Sie SQL Server:
Es ist mir egal, in welcher Reihenfolge Sie die Zeilen zurückgeben, geben Sie einfach die Zeilen
zurückDa es Ihnen egal ist, wird SQL Server entscheiden, wie die Zeilen zurückgegeben werden sollen, was als die effizienteste mögliche Methode angesehen wird gerade jetzt (oder nach dem letzten Plan für Diese spezifische Abfrage wurde zwischengespeichert). Daher sollten Sie sich nicht auf das Verhalten verlassen, das Sie beobachten. Es kann von einer Abfrage zur nächsten wechseln, mit Datenänderungen, Statistikänderungen, Indexänderungen, Service Packs, kumulativen Updates, Upgrades usw. usw.
Wenn Sie für PostgreSQL die ORDER BY
-Klausel weglassen, können Sie die genau gleiche Abfrage 100 Mal ausführen, während die Datenbank nicht geändert wird, und einen Durchlauf in der Mitte in einer anderen Reihenfolge als die anderen ausführen. In der Tat könnte jeder Lauf in einer anderen Reihenfolge sein.
Ein Grund dafür könnte sein, dass wenn der ausgewählte Plan einen sequenziellen Scan des Heap einer Tabelle beinhaltet und bereits ein Seqscan des Heap in der Tabelle in Bearbeitung ist, wird die Abfrage an jedem Punkt beginnen, an dem der andere Scan schon läuft um den Zugriff auf die Festplatte zu reduzieren.
Wie andere Antworten darauf hingewiesen haben, geben Sie diese Reihenfolge an, wenn Sie die Daten in einer bestimmten Reihenfolge haben möchten. PostgreSQL wird den angeforderten Auftrag bei der Auswahl eines Plans berücksichtigen und einen Index verwenden, der Daten in dieser Reihenfolge bereitstellt, wenn dies günstiger ist, als die Zeilen auf andere Weise zu erhalten und dann zu sortieren.
GROUP BY
bietet keine Bestellgarantie; PostgreSQL könnte die Daten sortieren, um die Gruppierung durchzuführen, oder könnte eine Hash-Tabelle verwenden und die Zeilen in der Reihenfolge der vom Hashalgorithmus erzeugten Zahl zurückgeben (z. B. ziemlich zufällig) ). Und das könnte sich von einem Lauf zum nächsten ändern.
Es hat mich immer verblüfft, als ich ein DBA war, dass diese Eigenschaft von SQL so oft als skurril angesehen wurde. Betrachten Sie ein einfaches Programm, das gegen eine Textdatei läuft und eine Ausgabe erzeugt. Wenn sich das Programm nie ändert und sich die Daten nie ändern, erwarten Sie, dass sich die Ausgabe niemals ändert.
Dafür:
Wenn in der Abfrage keine ORDER BY-Klausel enthalten ist, ist die Reihenfolge der Zeilen nicht definiert.
Nicht ganz richtig - bei jeder RDBMS, an der ich je gearbeitet habe (Oracle, Informix, SQL Server, DB2, um nur einige zu nennen), hat eine DISTINCT-Klausel dieselbe Wirkung wie ORDER BY, da das Auffinden eindeutiger Werte eine Sortierung beinhaltet Definition.
BEARBEITEN (6/2/14):
Erstellen Sie eine einfache Tabelle
Für DISTINCT und ORDER BY sind sowohl der Plan als auch die Kosten identisch, da es scheinbar die gleiche Operation ist, die ausgeführt werden soll.
Und nicht überraschend, der Effekt ist also der gleiche
Tags und Links sql-server mysql sqlite oracle postgresql