Ein Programmierer testet und vergleicht dieselbe Anwendung, die dieselbe Datenbankstruktur und dieselben Daten verwendet, nur in zwei separaten Datenbanken, eine mit Oracle 8 und eine mit Oracle 9.
Die App führt eine Abfrage ohne ORDER BY
Klausel aus.
Er behauptet, dass die ORDER-BY-less-Abfrage die Zeilen in beiden Datenbanken in derselben Reihenfolge zurückgeben sollte.
Ich sage ihm, dass es keine Garantie für dieselbe Zeilenreihenfolge gibt, es sei denn, Sie geben ausdrücklich eine ORDER BY-Klausel an.
Die Datenbank hat dieselben Indizes und Schlüssel. Der EXPLAIN-Plan zeigt jedoch, dass die Engine in einer der Datenbanken den Schlüssel einer der verknüpften Tabellen verwendet, während sie in der anderen Datenbank den Schlüssel einer anderen verwendet.
Er unterstellt, dass die beiden DB-Umgebungen nicht gleich sind, weil sie unterschiedliche Statistiken, unterschiedliche rdbms-Engines usw. haben, aber nicht, weil ich nicht jeden Index der ursprünglichen Datenbank replizieren konnte.
Ich sage ihm, dass er explizit eine ORDER BY
Klausel vorlegen muss, wenn die Reihenfolge wirklich so wichtig ist.
Die Frage
So kann ich ihn besser erklären:
In welcher Reihenfolge ruft eine Abfrage Zeilen ab, wenn Sie keine ORDER BY-Klausel explizit angeben, und warum gibt diese Abfrage die Zeilen nicht in derselben Reihenfolge zurück?
Antworten:
Aus Wikipedia :
Es ist also undefiniert.
Die SQL-Spezifikation gibt nicht die spezifische Reihenfolge an, in der Datensätze zurückgegeben werden sollen, daher ist sie implementierungsabhängig.
Ohne Indizes in der Tabelle wäre die sinnvolle Reihenfolge die Reihenfolge, in der die Datensätze eingefügt wurden. Wenn ein Primärschlüssel definiert ist, ist die sinnvolle Reihenfolge die Reihenfolge des Primärschlüssels. Da für die ANSI-Spezifikation jedoch keine bestimmte Bestellung erforderlich ist, ist dies Sache des Anbieters, und ihre Sensibilität kann von Ihrer oder meiner abweichen.
Da die Bestellung nicht in der Spezifikation angegeben ist, ist es nicht ratsam, sich auf das Verhalten der Implementierung eines bestimmten Anbieters zu verlassen, da diese von Anbieter zu Anbieter unterschiedlich sein kann und der Anbieter die Bestellung jederzeit ohne Vorwarnung ändern kann.
Wie Sie sagten, fügen Sie einfach die
ORDER BY
Klausel hinzu, wenn die Reihenfolge wichtig ist.quelle
Der Hinweis, dass die Spezifikation nicht angibt, in welcher Reihenfolge die Daten eingehen, hat nicht funktioniert. Wahrscheinlich, weil er weiß, dass sich die Daten irgendwo auf einer Festplatte oder im Speicher befinden und dies daher als Auftrag haben. Fragen Sie ihn nach der Reihenfolge der berechneten Daten aus mehreren Tabellen. Das heißt, Sie erstellen ein Beispiel, in dem Sie 4 Tabellen verbinden, 2 davon berechnen und nur den berechneten Wert zurückgeben.
Die Engine gibt die Daten in der Reihenfolge zurück, in der sie gefunden wurden (ohne eine Reihenfolge von). Wie sie gefunden werden, hängt jedoch von Faktoren ab, die sich ändern können - Indizes, Statistiken, Caches. Im Allgemeinen werden die Daten in einer konsistenten Reihenfolge angezeigt. Wenn Sie jedoch von der Reihenfolge abhängig sind, müssen Sie danach fragen.
quelle