Kürzlich habe ich Kollegen erklärt, wie wichtig es ist, eine Spalte zu haben, nach der Daten in einer Datenbanktabelle sortiert werden können, wenn dies beispielsweise für chronologisch geordnete Daten erforderlich ist. Dies erwies sich als etwas schwierig, da sie ihre Abfrage einfach scheinbar endlos wiederholen konnten und immer dieselbe Reihe von Zeilen in derselben Reihenfolge zurückgaben.
Ich habe das schon einmal bemerkt und konnte nur darauf bestehen, dass sie mir vertrauen und nicht einfach davon ausgehen, dass sich eine Datenbanktabelle wie eine herkömmliche CSV- oder Excel-Datei verhält.
Beispiel: Ausführen der Abfrage (PostgreSQL)
create table mytable (
id INTEGER PRIMARY KEY,
data TEXT
);
INSERT INTO mytable VALUES
(0, 'a'),
(1, 'b'),
(2, 'c'),
(3, 'd'),
(4, 'e'),
(5, 'f'),
(6, 'g'),
(7, 'h'),
(8, 'i'),
(9, 'j');
erstellt eine Tabelle mit einer klaren konzeptuellen Reihenfolge. Dieselben Daten auf einfachste Weise auszuwählen, wäre:
SELECT * FROM mytable;
Gibt mir immer die folgenden Ergebnisse:
id | data
----+------
0 | a
1 | b
2 | c
3 | d
4 | e
5 | f
6 | g
7 | h
8 | i
9 | j
(10 rows)
Ich kann dies immer und immer wieder tun und es werden mir immer die gleichen Daten in der gleichen Reihenfolge zurückgegeben. Ich weiß jedoch, dass diese implizite Reihenfolge gebrochen werden kann. Ich habe sie bereits zuvor gesehen, insbesondere bei großen Datenmengen, bei denen ein zufälliger Wert bei Auswahl anscheinend an die "falsche" Stelle geworfen wird. Mir ist aber aufgefallen, dass ich nicht weiß, wie das passiert oder wie ich es reproduzieren soll. Ich finde es schwierig, Ergebnisse bei Google zu erhalten, da die Suchanfrage in der Regel nur allgemeine Informationen zum Sortieren von Ergebnismengen enthält.
Meine Fragen lauten also im Wesentlichen:
Wie kann ich nachweislich und konkret nachweisen, dass die Rückgabereihenfolge von Zeilen aus einer Abfrage ohne
ORDER BY
Anweisung nicht zuverlässig ist, indem ich vorzugsweise eine Aufschlüsselung der impliziten Reihenfolge verursache und zeige, auch wenn die betreffende Tabelle nicht aktualisiert oder bearbeitet wird ?Macht es überhaupt einen Unterschied, ob die Daten nur einmal massenweise eingefügt und dann nie wieder aktualisiert werden?
Ich würde eine postgres-basierte Antwort vorziehen, da dies diejenige ist, mit der ich am vertrautesten bin, aber ich bin mehr an der Theorie selbst interessiert.
order by
Klausel zu ihren Abfragen hinzuzufügen . Versuchen sie, im Quellcode-Speicher zu sparen? Tastaturverschleiß? Wie lange dauert es, die gefürchtete Klausel einzugeben?