DuckDB Ate the Modern Data Stack

An embedded analytical engine with no servers, no cluster, no migration cost just quietly displaced Spark for small data and Snowflake XS for medium data. MotherDuck closed Series B at a $400M post-money. Here's the part everyone undercounts.
The thing nobody priced in
For a decade, the assumption underneath every "modern data stack" deck was that analytical compute had to live behind a network boundary. You shipped your data to Snowflake, BigQuery, Redshift, or a Spark cluster, paid for warm warehouses or autoscaled clusters, and accepted the latency tax because the alternative was a single-machine Postgres that fell over at 100 GB.
That assumption was correct in 2014. It stopped being correct around 2022. The reason is the specific shape of what DuckDB did: it took a single-process columnar engine — no servers, no cluster, no orchestration — and made it fast enough that the crossover point where you actually needed a warehouse moved up by roughly two orders of magnitude. Suddenly the workload that justified a Snowflake XS warehouse and an Airflow DAG was a one-line duckdb -c "SELECT ... FROM read_parquet('s3://...')".
The market noticed. MotherDuck, the commercial DuckDB cloud, raised a $52.5M Series B led by Felicis at a $400M post-money valuation — $100M total funding, with a16z, Madrona, Amplify Partners, Altimeter, Redpoint, and Zero Prime all in (PR Newswire). DuckDB itself is open-source and free, so the funding signal is about something downstream: investors believe the workload split between "embedded DuckDB on a laptop or container" and "DuckDB-as-a-managed-service" is going to be enormous, and someone has to host the second half.
The crossover chart
The clearest way to see what DuckDB ate is to plot the workload-size axis against the right tool to use. Pre-DuckDB, the chart had two regions: Postgres for <10 GB, warehouse for everything above. Post-DuckDB, there are three regions, and the middle one is enormous.
That middle band — 1 GB to 500 GB — is most of analytical work in the world. Customer dashboards, finance close, ad-hoc data-science notebooks, ETL transforms, ML feature builds, internal reporting. None of it actually needed a cluster. The cluster existed because Postgres was the only single-machine alternative and Postgres was bad at columnar scans. Take Postgres out of the picture and the cluster's whole reason for existing in the small-to-medium range disappears.
What DuckDB actually killed
Three workloads died loudly between 2023 and 2026:
- Spark for <500 GB. If your dataset fits in a modern laptop's RAM (and most do), Spark's per-job startup cost, JVM overhead, and operational tax aren't worth paying. DuckDB on a single c6i.4xlarge crushes a small Spark cluster on the same workload at a fraction of the operational complexity. Databricks knows this — it's why they've been quietly building Photon as a single-node fast path and why Spark Connect is their answer to the embeddability question.
- Snowflake XS for ad-hoc. An XS warehouse costs $2/credit and burns a credit per hour even when idle (with the auto-suspend grace). For analysts who want to interrogate a 50 GB Parquet file three times an afternoon, that's pure waste. They're now opening DuckDB in a Jupyter notebook and pointing it at the same S3 path.
- The "transformation layer" of the modern data stack. dbt-on-Snowflake is being quietly displaced by dbt-on-DuckDB for any project where the source data is Parquet on object storage. The transforms run locally in CI, the artifacts land in a warehouse only if you actually need shared concurrent SQL access on top.
The single best demonstration of how far the engine has come is the memory profile. DuckDB now keeps peak memory under 2.5 GB even on 2 TB datasets, and partitioning a 140 GB dataset into smaller files cuts peak memory 8× to 160 MB (per the DuckDB Ecosystem Newsletter, February 2026). That is not a "small-data" engine. That is a small-machine engine running large-data workloads, which is a different and far more interesting category.
Where DuckDB doesn't go
Honest accounting: DuckDB is not the answer for everything, and three categories of workload are still warehouse-shaped:
- High-concurrency BI dashboards. DuckDB is single-process. If you need 200 concurrent analysts pinging the same tables, you still need a multi-tenant warehouse (or you put MotherDuck or DuckLake or some shared layer in front of DuckDB).
- Multi-PB scans. Above ~5 TB the constants flip and a distributed engine wins.
- Strong cross-team governance. A warehouse with a unified RBAC model and audit log is still the simplest answer if compliance matters.
Everything else? The right answer in 2026 is "try DuckDB first, escalate only if you hit a wall." Five years ago that sentence would have been laughed out of an architecture review. Today it's the default.
The interop layer that made it inevitable
The other piece of the story is that DuckDB stopped being just an engine and became a federation point. It can read Parquet, CSV, JSON, Iceberg, Delta, Postgres, MySQL, SQLite, and Excel directly. It can write to all of those. It can run in the browser via WASM. It can be embedded in Python, R, Node, Java, Rust, Go, and a dozen other languages. The newer Vortex columnar format gives further demonstrated TPC-H gains over Parquet. It is the closest thing the data ecosystem has to a universal adapter.
That universality is what made the displacement irreversible. Once a tool can read everything, write to everything, and run anywhere — and once it does columnar scans at warehouse speed on a single machine — the question stops being "should I add a warehouse to this project" and starts being "do I have a real reason not to start with DuckDB."
For most projects in 2026, the answer is no.
Subscribe to new posts from theaivibe.org
Related Posts
Apache Arrow and Apache DataFusion Now List ArrowMetal: Arrow Compute and a DataFusion Optimizer Rule on the Apple Silicon GPU
ArrowMetal is now on Apache Arrow's Powered By page and on Apache DataFusion's integrations list. What the two listings mean, and what the listed thing does as of 0.5.0, with one real run on each side.
Polars 2.0 Is Faster. With ArrowMetal on the Apple Silicon GPU, 52 of 107 Queries Go 1.35x to 7.94x Faster Still
Polars 2.0.0 shipped on 6 October and runs its group-bys, joins and sorts faster than 1.44. Two days later ArrowMetal's MetalEngine was re-measured against it on an Apple M4 Max: the GPU default takes 52 of 107 queries at 50 million rows, each 1.35x to 7.94x faster than the faster Polars 2.0 engine, and hands 12 back that it used to take. What Polars 2.0 changed, and how a crossover table answers it.
DataFusion on the Apple Silicon GPU: One Optimizer Rule, the Same SQL, Sorts 6.9x to 28.8x Faster
Apache DataFusion runs any physical optimizer rule you register. ArrowMetal 0.4.0 ships one for the Apple silicon GPU: the SQL is unchanged, the answers are DataFusion's, and full sorts of 250,000 to 50 million rows run 6.9x to 28.8x faster on an M4 Max. What it takes, what it leaves, and why.