Warum DuckDB
Es gibt viele Datenbankmanagementsysteme (DBMS). Aber es gibt kein System, das für alle Zwecke gleich gut geeignet ist. Jedes trifft andere Kompromisse für bestimmte Einsatzszenarien. DuckDB ist da keine Ausnahme. Hier erklären wir, welche Ziele DuckDB verfolgt und wie wir sie technisch erreichen. DuckDB ist ein relationales (tabellenorientiertes) DBMS mit Unterstützung für die Structured Query Language (SQL).
Zentrale Eigenschaften von DuckDB
Einfach
SQLite ist das am weitesten verbreitete DBMS der Welt. Einfache Installation und der Betrieb im selben Prozess sind zentral für diesen Erfolg. DuckDB übernimmt Einfachheit und In-Process-Betrieb – ist aber später mit dem Quack-Protokoll über den reinen In-Process-Betrieb hinausgegangen.
DuckDB hat keine externen Abhängigkeiten, weder beim Kompilieren noch zur Laufzeit. Für Releases wird der gesamte Quellbaum in zwei Dateien kompiliert: eine Header- und eine Implementierungsdatei, eine sogenannte „Amalgamation“. Das vereinfacht Deployment und die Einbindung in andere Build-Prozesse erheblich. Zum Bauen von DuckDB reicht ein funktionierender C++11-Compiler (DuckDB v2.0 wechselt zu C++17).
Es gibt keine separate DBMS-Serversoftware, die installiert, aktualisiert und gewartet werden muss. DuckDB läuft nicht als eigener Prozess, sondern vollständig eingebettet im Host-Prozess. Für die analytischen Anwendungsfälle von DuckDB bedeutet das zusätzlich einen schnellen Datentransfer zur und von der Datenbank. In manchen Fällen kann DuckDB fremde Daten ohne Kopieren verarbeiten. Das DuckDB-Python-Paket kann zum Beispiel Abfragen direkt auf Pandas-Daten ausführen, ohne Daten zu importieren oder zu kopieren.
Portabel
Dank fehlender Abhängigkeiten ist DuckDB extrem portabel. Es lässt sich für alle wichtigen Betriebssysteme (Linux, macOS, Windows) und CPU-Architekturen (x86, ARM) kompilieren. Der Einsatz reicht von kleinen, ressourcenarmen Edge-Geräten bis zu großen Servern mit mehreren Terabyte Speicher und über 100 CPU-Kernen. Mit DuckDB-Wasm läuft DuckDB auch im Browser und auf Mobiltelefonen.
DuckDB bietet APIs für C, C++, Go, Python, R, Rust, Java, Node.js und weitere Sprachen.
Funktionsreich
DuckDB bietet ernsthafte Datenmanagement-Funktionen. Es gibt umfangreiche Unterstützung für komplexe SQL-Abfragen mit einer großen Funktionsbibliothek, Window-Funktionen usw. DuckDB liefert transaktionale Garantien (ACID) durch eine eigene, für große Änderungen optimierte Multi-Version Concurrency Control (MVCC). Daten können im nativen DuckDB-Format gespeichert werden, als Einzeldatei-Datenbank oder in einem der unterstützten Lakehouse-Formate. Das native Format unterstützt Sekundärindizes für gezielte Zugriffe, während Lakehouse-Formate einschließlich DuckLake bis in den Petabyte-Bereich skalieren.
DuckDB ist tief in Python und R integriert, damit interaktive Datenanalyse effizient bleibt.
Schnell
DuckDB ist für analytische Abfrage-Workloads ausgelegt, auch Online Analytical Processing (OLAP) genannt. Typisch sind komplexe, länger laufende Abfragen über große Teile der gespeicherten Daten, etwa Aggregationen über ganze Tabellen oder Joins zwischen mehreren großen Tabellen. Änderungen an den Daten sind oft ebenfalls umfangreich: viele neue Zeilen oder große Teile von Tabellen werden auf einmal ergänzt oder geändert.
Dafür müssen die CPU-Zyklen pro Wert möglichst gering bleiben. Der Stand der Technik sind vektorisierte oder Just-in-Time-Ausführungsengines. DuckDB verwendet eine spaltenorientiert-vektorisierte Query-Engine: Abfragen werden weiterhin interpretiert, aber große Wertemengen (ein „Vektor“) in einem Schritt verarbeitet. Das reduziert den Overhead traditioneller Systeme wie PostgreSQL, MySQL oder SQLite, die Zeile für Zeile arbeiten. Vektorisierte Ausführung führt bei OLAP-Abfragen zu deutlich besserer Leistung.
Erweiterbar
DuckDB bietet einen flexiblen Erweiterungsmechanismus für neue Datentypen, Funktionen, Dateiformate und SQL-Syntax. Viele Kernfunktionen wie Parquet, JSON, Zeitzonen sowie HTTP(S) und S3 sind selbst Erweiterungen. Erweiterungen funktionieren auch in DuckDB Wasm. Beiträge aus der Community gibt es als Community Extensions.
Kostenlos
Die Entwicklung von DuckDB begann, als die Hauptentwickler im öffentlichen Dienst der Niederlande arbeiteten. Wir sehen es als Verantwortung, die Ergebnisse frei zugänglich zu machen. Deshalb erscheint DuckDB unter der sehr permissiven MIT-Lizenz, und das geistige Eigentum liegt bei der DuckDB Foundation. Beiträge sind willkommen, sofern sie unserem Verhaltenskodex entsprechen.
Gründlich getestet
DuckDB entstand in einer Forschungsgruppe, war aber nie als Forschungsprototyp gedacht, sondern als stabiles Datenbanksystem. Deshalb wird DuckDB intensiv mit Continuous Integration getestet. Die Testsuite enthält Millionen von Abfragen, darunter adaptierte Tests aus SQLite, PostgreSQL und MonetDB. Tests laufen auf vielen Plattformen und Compilern. Jeder Pull Request wird gegen den vollen Testsatz geprüft und nur bei Erfolg gemerged.
Zusätzlich stressen wir DuckDB unter Last: Wir führen die Benchmarks TPC-H und TPC-DS aus und testen parallele Nutzung durch viele Clients.
Begutachtete Papers und Abschlussarbeiten
- Runtime-Extensible Parsers (CIDR 2025)
- Robust External Hash Aggregation in the Solid State Age (ICDE 2024)
- These Rows Are Made for Sorting and That’s Just What We’ll Do (ICDE 2023)
- Join Order Optimization with (Almost) No Statistics (Master thesis, 2022)
- DuckDB-Wasm: Fast Analytical Processing for the Web (VLDB 2022 demo)
- Data Management for Data Science - Towards Embedded Analytics (CIDR 2020)
- DuckDB: An Embeddable Analytical Database (SIGMOD 2019 demo)
Projekte mit/für DuckDB
Projekte, die DuckDB nutzen, finden Sie im Awesome-DuckDB-Repository.
Auf den Schultern von Riesen
DuckDB nutzt Komponenten verschiedener Open-Source-Projekte und zieht Inspiration aus wissenschaftlichen Veröffentlichungen. Dafür sind wir dankbar. Ein Überblick:
- Ausführungsengine: Die vektorisierte Engine ist inspiriert von MonetDB/X100: Hyper-Pipelining Query Execution von Peter Boncz, Marcin Zukowski und Niels Nes. MonetDB/X100 wurde später zum Vectorwise-(Actian-Vector-)Datenbanksystem.
- Optimizer: Der Optimizer von DuckDB stützt sich auf Dynamic Programming Strikes Back von Guido Moerkotte und Thomas Neumann, Unnesting Arbitrary Queries von Thomas Neumann und Alfons Kemper sowie Improving Unnesting of Complex Queries von Thomas Neumann.
- Parallelität: DuckDB nutzt Morsel-driven Parallelism nach Morsel-Driven Parallelism von Viktor Leis, Peter Boncz, Alfons Kemper und Thomas Neumann.
- Concurrency Control: Die MVCC-Implementierung folgt Fast Serializable Multi-Version Concurrency Control for Main-Memory Database Systems von Thomas Neumann, Tobias Mühlbauer und Alfons Kemper.
- Sekundärindizes: DuckDB unterstützt Sekundärindizes nach The Adaptive Radix Tree: ARTful Indexing for Main-Memory Databases von Viktor Leis, Alfons Kemper und Thomas Neumann.
- SQL-Window-Funktionen: Die Implementierung nutzt Segment Tree Aggregation nach Efficient Processing of Window Functions in Analytical SQL Queries von Viktor Leis, Kan Kundhikanjana, Alfons Kemper und Thomas Neumann.
- SQL-Inequality-Joins: DuckDB verwendet IEJoin nach Lightning Fast and Space Efficient Inequality Joins von Zuhair Khayyat, William Lucia, Meghna Singh, Mourad Ouzzani, Paolo Papotti, Jorge-Arnulfo Quiané-Ruiz, Nan Tang und Panos Kalnis.
- Kompression von Gleitkommawerten: DuckDB unterstützt mehrere Algorithmen:
- Chimp von Panagiotis Liakos, Katia Papakonstantinopoulou und Yannis Kotidis
- Patas, eine Eigenentwicklung
- ALP (adaptive lossless floating-point compression) von Azim Afroozeh, Leonard Kuffo und Peter Boncz, die auch ihre Implementierung beigetragen haben
- SQL-Parser: Wir nutzen den PostgreSQL-Parser, der als eigenständige Bibliothek vorliegt. Die Übersetzung in unseren Parse-Tree ist von Peloton inspiriert.
- Shell: Wir nutzen die SQLite-Shell, um mit DuckDB zu arbeiten.
- Reguläre Ausdrücke: DuckDB verwendet Googles RE2.
- String-Formatierung: DuckDB nutzt die fmt-Bibliothek.
- UTF-8: DuckDB nutzt utf8proc, um UTF-8 zu prüfen und zu normalisieren.
- Kollation und Zeit: DuckDB nutzt ICU für Kollation, Zeitzonen und Kalender.
- Test-Framework: DuckDB nutzt Catch2.
- Testfälle: Wir verwenden die SQL Logic Tests von SQLite.
- Ergebnisprüfung: Manuel Rigger hat mit SQLancer die Korrektheit von DuckDB-Ergebnissen geprüft.
- Query-Fuzzing: Wir nutzen SQLsmith über die
sqlsmith-Erweiterung. - JSON-Parser: Wir nutzen yyjson in der JSON-Erweiterung.
USING KEYin rekursiven CTEs: Eine Idee der Universität Tübingen, mit der Zwischenergebnisse in rekursiven Common Table Expressions als keyed Dictionaries behandelt werden können. Siehe “How DuckDB isUSING KEYto Unlock Recursive Query Performance”.