PDA

View Full Version : SQL - automatische Sortierung der Datenbank



apparat
19-02-16, 14:27
Hallo zusammen,

nach einer Systemumstellung auf V7R1 mussten wir feststellen, dass sich die Datenbank bei Select Abfragen anders verhält als bei früheren Releases.
Speziell geht es darum, dass die Daten per SQL automatisch sortiert werden obwohl kein ORDER BY angegeben wurde. Die Sortierung wird dabei spaltenweise durchgeführt.

Gibt es eine Möglichkeit dies abzustellen und die Datensätze per SELECT in der Reihenfolge zu bekommen, wie sie auch in der Datei stehen?

Behelfen kann man sich leider nur wenn man im ORDER BY auf die relative Satznummer geht. Vielleicht hat jemand eine Idee :)

Beste Grüße,
Daniel

B.Hauser
19-02-16, 14:36
Der Optimizer entscheidet, mit welchen Zugriffswegen er am schnellsten an die gewünschten Daten herankommt. Die Entscheidung hängt ab, von der Feld-Auswahl, Join-Anweisungen, WHERE-Bedingungen, GROUP BY, ORDER BY Anweisungen sowie der Datenzusammensetzung ab.
Sofern kein (zusätzlicher) ORDER BY angegeben ist, werden die Datensätze in der Reihenfolge des verwendeten Zugriffsweg ausgegeben, oder falls ein Table Scan ausgeführt wird in Eingangsfolge.

Übrigens seit Release 7.1 (TR5 oder TR6) ist es auch möglich SQL Indices über die Relative Satz-Nr. zu bilden.

Sofern Du die Datensätze in der Reihenfolge der relativen Satz-Nr. benötigst, musst Du einen entsprechenden Order By angeben. Ansonsten gibt es (und gab es auch früher nicht) keine Garantie, dass die Datensätze in der gewünschten Reihenfolge ausgegeben werden.

Fuerchau
19-02-16, 14:42
Das liegt am Optimizer, da dieser ggf. über Index sortiert.
Je nach Where-/Group-by-Klausel gibt es dann eine andere Sortierung ohne eine Order-By-Klausel.
SQL hat ohne Order nie eine Sortierfolge garantiert. Da musst du nur sehr viel Glück gehabt haben.

Eine FIFO-Folge kann man wirklich nur per Order erstellen.
Spätesten aber bei REUSEDLT(*YES) ist die Sortierung auch wieder vom Zufall und nicht von der Entstehung abhängig.

Abstellen lässt sich das nicht, macht für SQL auch wirklich keinen Sinn.