Zum Inhalt springen

Reihenfolgentreue

Bei vielen Operationen erhält DuckDB die Reihenfolge der Zeilen, ähnlich wie Data-Frame-Bibliotheken wie Pandas.

Beispiel

Nehmen Sie zum Beispiel die folgende Tabelle:

CREATE TABLE tbl AS
SELECT *
FROM (VALUES (1, 'a'), (2, 'b'), (3, 'c')) t(x, y);
SELECT *
FROM tbl;
x y
1 a
2 b
3 c

Betrachten Sie die folgende Abfrage, die die Zeilen zurückgibt, in denen x eine ungerade Zahl ist:

SELECT *
FROM tbl
WHERE x % 2 == 1;
x y
1 a
3 c

Weil die Zeile (1, 'a') in der ursprünglichen Tabelle vor (3, 'c') steht, ist garantiert, dass sie auch in dieser Tabelle davor steht.

Klauseln

Die folgenden Klauseln garantieren, dass die ursprüngliche Zeilenreihenfolge erhalten bleibt:

  • COPY (siehe Einfügereihenfolge)
  • FROM mit einer einzelnen Tabelle
  • LIMIT
  • OFFSET
  • SELECT
  • UNION ALL
  • WHERE
  • Fensterfunktionen mit einer leeren OVER-Klausel
  • Common Table Expressions und Tabellen-Unterabfragen, sofern sie nur die oben genannten Bestandteile enthalten

Tipp row_number() OVER () erlaubt es, die ursprüngliche Zeilenreihenfolge in eine explizite Spalte umzuwandeln, auf die in Operationen verwiesen werden kann, die die Zeilenreihenfolge standardmäßig nicht erhalten. Bei materialisierten Tabellen kann die Pseudospalte rowid denselben Zweck erfüllen.

Die folgenden Operationen garantieren nicht, dass die Zeilenreihenfolge erhalten bleibt:

  • FROM mit mehreren Tabellen und/oder Unterabfragen
  • JOIN
  • UNION
  • USING SAMPLE
  • Tabellenweite Aggregation (die Eingabereihenfolge, d. h. die Reihenfolge, in der Zeilen in reihenfolgeempfindliche Aggregatfunktionen eingespeist werden, ist nicht garantiert, sofern sie nicht explizit in der Aggregatfunktion angegeben wird)
  • GROUP BY (weder Ein- noch Ausgabereihenfolge sind garantiert)
  • ORDER BY (insbesondere muss ORDER BY keinen stabilen Algorithmus verwenden)
  • Skalare Unterabfragen

Einfügereihenfolge

Standardmäßig erhalten die folgenden Komponenten die Einfügereihenfolge:

Die Erhaltung der Einfügereihenfolge wird über die Konfigurationsoption preserve_insertion_order gesteuert. Diese Einstellung ist standardmäßig true und gibt an, dass die Reihenfolge erhalten bleiben soll. Um diese Einstellung zu ändern, verwenden Sie:

SET preserve_insertion_order = false;