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 tblWHERE 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)FROMmit einer einzelnen TabelleLIMITOFFSETSELECTUNION ALLWHERE- 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 Pseudospalterowiddenselben Zweck erfüllen.
Die folgenden Operationen garantieren nicht, dass die Zeilenreihenfolge erhalten bleibt:
FROMmit mehreren Tabellen und/oder UnterabfragenJOINUNIONUSING 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 mussORDER BYkeinen stabilen Algorithmus verwenden)- Skalare Unterabfragen
Einfügereihenfolge
Standardmäßig erhalten die folgenden Komponenten die Einfügereihenfolge:
- CSV-Reader (Funktion
read_csv) - JSON-Reader (Funktion
read_json) - Parquet-Reader (Funktion
read_parquet)
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;