Oracle SQL gibt Zeilen in beliebiger Weise zurück, wenn keine "order by" -Klausel verwendet wird

8

Vielleicht kann mir jemand das erklären, aber wenn Sie eine Datentabelle von Oracle abfragen, wo mehrere Datensätze für einen Schlüssel existieren (sagen wir eine Kunden-ID), kann der Datensatz, der zuerst für diesen Kunden erscheint, abweichen, wenn es keine implizite gibt. order by "Anweisung, die den Auftrag erzwingt, indem Sie ein alternatives Feld wie einen Transaktionstyp angeben. Wenn Sie also die gleiche Abfrage in derselben Tabelle ausführen, könnte dies zu einer anderen Datensatzreihenfolge führen als vor 10 Minuten.

ZB könnte ein Lauf ergeben:

Cust_ID, Transaktionsart
123 A
123 B

Wenn keine Klausel "order by Transaction_Type" verwendet wird, kann Oracle das folgende Ergebnis bei der nächsten Ausführung der Abfrage beliebig zurückgeben:

Cust_ID, Transaktionsart
123 B
123 A

Ich glaube, ich hatte den Eindruck, dass es eine Datenbankreihenfolge von Zeilen in Oracle gab, die (vielleicht) die physische Reihenfolge auf dem Datenträger widerspiegelte. Mit anderen Worten, eine willkürliche Reihenfolge, die unveränderlich ist und das gleiche Ergebnis garantiert, wenn eine Abfrage erneut ausgeführt wird.

Hat das mit dem Optimierer zu tun und wie entscheidet er, wo die Daten am effizientesten abgerufen werden sollen?

Natürlich ist die beste Vorgehensweise aus einer Programmierperspektive, zu zwingen, welche Reihenfolge auch immer erforderlich ist, ich war nur ein wenig durch dieses Verhalten verunsichert.

    
jgunnink 21.09.2010, 21:06
quelle

8 Antworten

22

Die Reihenfolge der Zeilen, die von einer SELECT -Anweisung an die Anwendung zurückgegeben werden, lautet COMPLETEY ARBITRARY , sofern nicht anders angegeben. Wenn Sie Zeilen in einer bestimmten Reihenfolge zurückgeben, benötigen oder erwarten möchten, liegt es in der Verantwortung des Benutzers, eine solche Reihenfolge anzugeben.

(Achtung: Einige Versionen von Oracle würden Daten implizit in aufsteigender Reihenfolge sortieren, wenn bestimmte Operationen verwendet werden, wie zB DISTINCT, UNION, MINUS, INTERSECT oder GROUP BY . Da Oracle jedoch eine Hash-Sortierung implementiert hat, hängt die Art der Sortierung von Daten können variieren, und viele SQL, die auf diese Funktion angewiesen sind, sind kaputt gegangen.)

    
Adam Musch 21.09.2010 21:15
quelle
8

Es gibt keine Standardreihenfolge. Wenn Sie ORDER BY nicht angeben, können Sie das gleiche Ergebnis wie die ersten 10000 Mal erhalten, dann kann es sich ändern.

Beachten Sie, dass dies auch bei ORDER BY für gleiche Werte gilt. Zum Beispiel:

%Vor%

Wenn Sie ORDER BY Col2 verwenden, wissen Sie immer noch nicht, ob Zeile 1 oder 2 zuerst kommen.

    
egrunin 21.09.2010 21:11
quelle
6

Stellen Sie sich die Reihen in einer Tabelle wie Bälle in einem Korb vor. Haben die Bälle eine Bestellung?

Ich glaube nicht, dass es ein DBMS gibt, das eine Bestellung garantiert, wenn ORDER BY nicht angegeben ist.

Einige können immer die Zeilen in der Reihenfolge zurückgeben, in der sie eingefügt wurden, aber das ist ein Implementierungsnebeneffekt.

Einige Ausführungspläne könnten dazu führen, dass die Ergebnismenge auch ohne ORDER BY sortiert wird, aber dies ist ein Implementierungsnebeneffekt, auf den Sie sich nicht verlassen sollten.

    
a_horse_with_no_name 21.09.2010 21:22
quelle
6

Wenn keine ORDER BY-Klausel vorhanden ist, kann die Datenbank (nicht nur Oracle - irgendeine relationale Datenbank) Zeilen in der Reihenfolge zurückgeben, in der sie gefunden wurde. Dies hängt vom Abfrageplan ab, der vom Optimierer ausgewählt wurde.

Wenn die Reihenfolge, in der die Zeilen zurückgegeben werden, wichtig ist, müssen Sie eine ORDER BY-Klausel verwenden. Sie können manchmal Glück haben und die Zeilen kommen in der Reihenfolge zurück, in der Sie sie auch ohne ORDER BY haben möchten, aber es gibt keine Garantie, dass A) Sie bei anderen Abfragen Glück haben und B) die Reihenfolge in der die Zeilen werden morgen zurückgegeben werden die gleichen wie die Reihenfolge, in der sie heute zurückgegeben werden.

Außerdem können Aktualisierungen des Datenbankprodukts das Verhalten von Abfragen ändern. Wir mussten beim Upgrade der Hauptversion letztes Jahr ein bisschen herumkrabbeln, als wir herausfanden, dass Oracle 10 GROUP BY-Ergebnisse in einer anderen Reihenfolge als Oracle 9 zurückgegeben hat. Grund - keine ORDER BY-Klausel.

ORDER BY - wenn die Reihenfolge der zurückgegebenen Daten wirklich wichtig ist.

    
Bob Jarvis 22.09.2010 13:01
quelle
5

Die einfache Antwort ist, dass der SQL-Standard besagt, dass es keine Standardreihenfolge für Abfragen gibt, die keine ORDER BY-Anweisung haben, also sollten Sie niemals eine davon annehmen.

Der wahre Grund dürfte sich auf die Hashes beziehen, die jeder Zeile zugewiesen sind, wenn sie in den Datensatz gezogen wird. Es besteht kein Grund zu konsistentem Hashing.

    
Matthew Flynn 21.09.2010 21:20
quelle
2

Wenn Sie ORDER BY nicht verwenden, ist die Reihenfolge beliebig ; abhängig von physikalischen Speicher- und Speicheraspekten. Wenn Sie also dieselbe Abfrage in 10 Minuten hunderte Male wiederholen, erhalten Sie jedes Mal fast die gleiche Reihenfolge, weil sich wahrscheinlich nichts ändert.

Dinge, die die "noorder-Reihenfolge" ändern könnten, sind:

  • der ausführende Plan - wenn geändert wird (Sie haben darauf hingewiesen das)
  • fügt die in die Abfrage einbezogenen Tabellen ein und löscht sie.
  • andere Dinge wie die Anwesenheit in der Erinnerung der Zeilen (andere Abfragen an anderen Tabellen könnten das beeinflussen)
Florin Ghita 23.09.2010 09:38
quelle
0

Wenn Sie in parallele Datenabruf-I / O kommen, ist es nicht möglich, unterschiedliche Sequenzen in verschiedenen Läufen zu erhalten, auch ohne die gespeicherten Daten zu ändern?

Das heißt, in einer Multiprocessing-Umgebung ist die Reihenfolge der Vervollständigung von parallelen Threads nicht definiert und kann mit dem variieren, was sonst auf demselben gemeinsamen Prozessor geschieht.

    
user2441339 31.05.2013 17:11
quelle
0

Da ich neu in der Oracle-Datenbank-Engine bin, bemerkte ich dieses Verhalten in meinen SELECT -Anweisungen, die keine ORDER BY haben.

Ich verwende Microsoft SQL Server seit Jahren. SQL Server Engine ruft immer Daten ab, die nach dem "Clustered Index" der Tabelle geordnet sind. Dies ist im Grunde der Primärschlüsselindex. SQL Server fügt basierend auf dem gruppierten Index immer neue Daten in einer sequenziellen Reihenfolge ein.

Wenn Sie also in SQL Server eine Auswahl für eine Tabelle ohne Reihenfolge durchführen, werden immer Daten abgerufen, die nach Primärschlüssel sortiert sind.

ORDER BY kann zu erheblichen Leistungseinbußen führen, deshalb möchten Sie sie nicht verwenden, wenn Sie nicht mit einer inkonsistenten Ergebnisreihenfolge zufrieden sind.

Ich kam zu der Schlussfolgerung, dass ich in ALL meinen Oracle-Abfragen ORDER BY verwenden muss oder dass ich eine unvorhergesehene Reihenfolge bekomme, die sich sehr stark auf meine Endbenutzerberichte auswirken wird.

    
Mohamed Saif 24.12.2014 08:30
quelle

Tags und Links