Seltsamer Sortierfehler (ist es ein Fehler?) in Postgres bei der Bestellung von zwei Spalten mit identischen Werten

8

Ich habe die folgende Abfrage in Postgres:

%Vor%

Der Datensatz auf dem 20. Platz hat eine identische session_time zu dem 21. Datensatz.

Diese Abfrage gibt 20 Ergebnisse zurück. Wenn Sie jedoch die Ergebnisse mit der gesamten Datenbank vergleichen, gibt die Abfrage die Ergebnisse für das erste bis zum neunten und das für das 21. zurück und überspringt den 20..

Diese Abfrage kann durch Hinzufügen von "id" zur Bestellung behoben werden:

%Vor%

Allerdings habe ich mich gefragt, wie dieser Fehler aufgetreten ist? Wie funktioniert die Bestellung von Postgres identisch mit Offsets und Limits? Ist es zufällig? Ist es ein Fehler mit Postgres?

    
Smickie 10.08.2012, 15:26
quelle

1 Antwort

8

Dies ist kein Fehler. Das Limit und der Offset treten nach der Bestellung auf und es ist nicht deterministisch, welche Zeilen in einem Fall gegenüber einem anderen ausgewählt werden. Im Allgemeinen möchten Sie einen Tiebreaker, damit Ihre Bestellung stabil und deterministisch ist (ich bevorzuge die Verwendung von eindeutigen Tiebreakern, auch wenn ich keine Limit- oder Offset-Probleme habe, um sicherzustellen, dass die Abfrage bei jeder Ausführung gleich ist).

Wenn Sie eine Seitennummerierung durchführen, fügen Sie der Sortierung den Primärschlüssel oder den Ersatzschlüssel als Tiebreaker hinzu. Das ist wirklich der beste Weg.

    
Chris Travers 06.04.2013 16:09
quelle