2009-05-05 2 views

Antwort

41

Nein, wenn Sie "Order by" nicht verwenden, kann keine Bestellung garantiert werden. Tatsächlich ist nicht garantiert, dass die Reihenfolge von einer Abfrage zur nächsten identisch ist. Denken Sie daran, dass SQL Daten satzweise verarbeitet. Jetzt kann die eine oder die andere Datenbankimplementierung dazu führen, dass die Reihenfolge in gewisser Weise gegeben ist, aber Sie sollten sich nie darauf verlassen.

+1

Gibt es eine Chance, dass die Datensätze in der Reihenfolge des Clustered-Indexes zurückgegeben werden? –

+1

Eine sehr gute Chance, aber nicht garantiert. Komplizierte Abfragen, die Joins, Sichten, Unterabfragen und dergleichen umfassen, können die Ergebnismenge sehr unterschiedlich geordnet belassen. –

+0

AND kann manchmal in der Clustered-Index-Reihenfolge und manchmal nicht zurückgegeben werden. Verwenden Sie immer eine Bestellung, wenn Sie eine bestimmte Bestellung wünschen. – HLGEM

6

Wenn ich eine Auswahl mache, ist es immer garantiert, dass mein Ergebnis vom Primärschlüssel bestellt wird, oder sollte ich es mit einer 'Bestellung von' angeben?

Nein, es ist bei weitem nicht garantiert.

SELECT * 
FROM table 

höchstwahrscheinlich wird TABLE SCAN verwenden, die Primärschlüssel nicht überhaupt.

können Sie einen Hinweis verwenden:

SELECT /*+ INDEX(pk_index_name) */ 
     * 
FROM table 

, aber selbst in diesem Fall ist die Bestellung nicht garantiert ist: Wenn Sie Enterprise Edition verwenden, die Abfrage parallelisiert werden kann.

Dies ist ein Problem, da ORDER BY nicht in einer SELECT Klausel Unterabfrage verwendet werden kann und man so etwas nicht schreiben kann:

SELECT (
     SELECT column 
     FROM table 
     WHERE rownum = 1 
     ORDER BY 
       other_column 
     ) 
FROM other_table 
+0

Kein Problem: SELECT DISTINCT FIRST_VALUE (Spalte) OVER (ORDER BY other_column) FROM Tabelle; –

+0

@ Jeffrey: es ist möglich, aber die Unterabfrage wählt alle FIRST_VALUE und HASH UNIQUE sie. Dadurch wird die gesamte Leistung abgebrochen, wenn die Unterabfrage viele Zeilen zurückgibt. – Quassnoi

0

Es auf Ihrer DB hängt und es hängt auch von indizierten Feldern.

Zum Beispiel in meiner Tabelle Benutzer hat jeder Benutzer eindeutige varchar (20) Feld - Login und Primärschlüssel - ID.

Und "Select * von Benutzern" gibt Rowset nach Login zurück.

0

Wenn Sie eine bestimmte Bestellung wünschen, dann deklarieren Sie sie ausdrücklich mit ORDER BY.

Was ist, wenn die Tabelle keinen Primärschlüssel hat?

+0

Wenn die Tabelle keinen Primärschlüssel hat, haben Sie andere Probleme als die Reihenfolge, in der die Daten zurückgegeben werden. –

+0

total, aber es hält die Leute nicht davon ab, Tische schlecht zu gestalten! – pmcilreavy

0

Wenn Sie Ihre Ergebnisse in einer bestimmten Reihenfolge, immer einen Auftrag angeben, indem

2

Nein, Bestell nie garantiert, wenn Sie eine ORDER BY verwenden.

Die Reihenfolge, in der die Zeilen abgerufen werden, hängt von der Zugriffsmethode (z. B. vollständiger Tabellenscan, Indexsuche), den physischen Attributen der Tabelle, der logischen Position jeder Zeile in der Tabelle und anderen Faktoren ab. Diese können sich alle ändern, auch wenn Sie Ihre Abfrage nicht ändern. Um eine konsistente Reihenfolge in Ihrer Ergebnismenge zu gewährleisten, ist ORDER BY erforderlich.