DuckDB 2.0 is heading for a fall release, and an alpha build is already available. MotherDuck ran the headline features on a single M5 laptop and against Amazon S3 to measure what actually changes for developers who build tables and pipelines, rather than for the engineers writing the database itself.
The verdict from that test: DuckDB 2.0 is faster, but the gains depend heavily on how your data is shaped. Three features drive most of the improvement, and only one of them requires no change to your queries at all.
Async I/O makes S3 reads 2x to 3x faster
The most painless upgrade is a rewritten I/O layer. In the benchmark, a query reading a 2.2 GB Parquet file on S3 — Stack Overflow votes, 228 million rows across 2268 row groups — sped up substantially without a single line of SQL changing.
The mechanism is a split between network and CPU work. In older versions, each worker thread downloaded a row group, waited, decoded it, then downloaded the next one, so CPUs sat idle during transfers. In 2.0 a separate thread pool only downloads, keeping dozens of row groups in flight, while the worker threads only decode.
One setting controls this behaviour: read_ahead_depth, which tells the download pool how many row groups to fetch ahead. It defaults to -1, meaning automatic and sized from your thread count, so the feature is on out of the box. Setting it to 0 restores the old behaviour.
MotherDuck notes a caveat: datasets split into thousands of tiny 1 MB Parquet files see no meaningful gain, because the bottleneck there is per-file round trips that read-ahead cannot remove. Storing a data lake that way remains poor practice.
Recursive CTEs: from org charts to git history
DuckDB's team rewrote the recursive CTE engine and claims up to 40x on graph reachability. A recursive CTE is essentially a loop over a table, used for org charts, folder trees, bills of materials, reply threads, data lineage and git history.



