DuckDB is an open-source, in-process OLAP database — an embeddable columnar SQL engine that queries Parquet, CSV, and dataframes with no server to run.
There is nothing to deploy: it is a library embedded in your process, with clients for Python, R, Java, Go, Node, Rust, and WebAssembly, plus a CLI and ODBC and ADBC drivers. Extensions add httpfs for object storage, Iceberg, Delta, and DuckLake. MotherDuck is the managed serverless service built on it.
How DuckDB answers the questions Query Engines turns on.
| How it works | |
| Engine shape | In-process library: no server |
| Catalog required | Nothing required: attach an Iceberg REST catalog if you want one, or DuckLake, which keeps the catalog in a SQL database rather than in files |
| SQL dialect | DuckDB SQL (PostgreSQL-flavoured) |
| Running it | |
| Concurrent users | One writing process at a time, MVCC across threads inside it, other processes read-only; multi-process writes need DuckLake or the beta Quack protocol |
| Acceleration | No result cache; min-max zonemaps are built automatically for every column, and ART indexes come from CREATE INDEX or a unique constraint |
| Failure recovery | ACID transactions and a write-ahead log rather than distributed recovery, a failed query fails, in the process that ran it |
| Connections | |
| Non-lake sources | ATTACH a Postgres, MySQL or SQLite database and query it in place, or reach S3, GCS and Azure over httpfs; extensions add Iceberg, Delta, DuckLake and Lance |
| Table formats | Parquet, CSV and JSON natively; Iceberg writes via an attached REST catalog, Delta reads with blind appends |
| Client access | In-process from C, Python, R, Java, Go, Node, Rust and WebAssembly, plus a CLI, and official ODBC and ADBC drivers |
| Access | |
| Access control | None: whatever the embedding application enforces |
vs DuckDB: Commercial · Managed · Serverless · Subscription
vs DuckDB: Self-hosted · Rust
vs DuckDB: Operational complexity: High · Batch · Interactive · Java