DuckDB consulting

Find out if DuckDB fits your workload before you bet a migration on it.

I'm Arshad Ansari. I wrote Local-First Analytics, the book on running analytics with DuckDB and Parquet instead of a cloud warehouse. In one week, for a fixed $3,000, I tell you whether your workload fits, what the move would save, and prove it with your heaviest query running on your own data.

Book a free 30-minute scoping call
4,912 pipeline partitions at 99.9%Author of Local-First AnalyticsWatch it run →

You probably recognise one of these

  • Your warehouse bill is five figures a year and most queries scan a few gigabytes.
  • Someone on the team ran the heavy query in DuckDB on a laptop, it finished in seconds, and now nobody knows what to do with that fact.
  • You are being sold Fabric, Databricks or a bigger Snowflake tier for data that would fit on one machine.
  • You already run DuckDB somewhere — a notebook, a cron job — and it is quietly becoming load-bearing with no backups and no plan.
  • You want analytics inside your product and a per-query meter makes the unit economics worse with every customer.

DuckDB is excellent inside one shape and wrong outside it. The expensive mistakes go both ways: paying a per-query meter for work one machine would do, or moving a workload that needs a server onto a library. I have written up what DuckDB is good at in production, where it is not safe and how it compares with Snowflake. This page is for when you need the answer for your system, not in general.

How it works

It is the same fixed-price audit I run on any data platform, pointed at one question.

1 · DuckDB fit assessment

$3,000 fixed · 12–20 hours over one week

Read-only access and your warehouse cost export. I measure the working set your queries really touch, count writers and concurrent readers, and rebuild your heaviest query on DuckDB against a copy of your data. You get a written fit verdict, a cost model of today against DuckDB and Parquet, the proof-of-concept with timings, and a ranked list of what would have to change. How the audit week runs →

I only recommend it after a scoping call and a look at your cost export — if day one shows no credible opportunity, you don't pay.

2 audit slots a month · one full-time engagement at a time — currently open

2 · Migration or build

$15–40k · assessment fee credited

Parquet in object storage as the durable copy, DuckDB batch jobs under Dagster or Airflow, a serving layer sized to who queries it, and the old warehouse running in parallel until every number matches. More on builds →

3 · Or do it yourself

The 16 questions I start from are below, in full. The longer argument, with runnable code, is the book. If your team can work through both, you do not need me.

The DuckDB Production-Fit Checklist

16 questions, each with what a bad answer sounds like. A bad answer in the first section is an architecture decision, not a setting.

01

Is this DuckDB-shaped work?

DuckDB is excellent inside one shape and wrong outside it. Answer these before any tuning — a bad answer here is an architecture decision, not a setting.

  1. How many processes need to write, and do they ever overlap?

    Bad answer: More than one, at the same time — an ETL job and an ingestion service both writing the same file. DuckDB allows one writing process. The second gets a lock error, or someone copies the file to dodge the lock and a reader sees a half-written state.

  2. What is the working set — the bytes a typical query actually reads?

    Bad answer: Nobody has measured it, and the machine is sized off total data volume. What decides single-node fit is what one query touches after partition pruning and column selection, and it is usually far smaller.

  3. How many queries run at the same moment at peak?

    Bad answer: Dozens of people writing ad-hoc SQL at once, or a customer dashboard queried by every logged-in user with no cache in front. That is a server’s job, and DuckDB has no server.

  4. How fresh does the data need to be?

    Bad answer: Seconds old, from several producers writing continuously. DuckDB’s natural write pattern is a batch job; a constant stream of small writes from many services is the workload it is worst at.

  5. Does anyone need roles, row-level security or an audit trail inside the database?

    Bad answer: Yes, because a regulator or a customer contract asks for it. DuckDB has no user model — the file is the permission boundary — and that is usually decisive on its own.

02

Could you lose the file and shrug?

ACID covers a crash mid-transaction. It does not cover a deleted file, a container disk that vanished with the pod, or a copy taken mid-write.

  1. If the database file disappeared right now, how long until you are back?

    Bad answer: Nobody knows, or the answer is “restore from backup”. The design that holds keeps Parquet in object storage as the source of truth and treats the database file as a cache you can rebuild.

  2. Where does the database file live?

    Bad answer: On a pod’s local disk or in a container’s writable layer. It lives exactly as long as the pod does.

  3. How is it backed up?

    Bad answer: By copying the file while a writer may be mid-transaction. The copy’s contents are undefined. Use EXPORT DATABASE, or rebuild from Parquet.

  4. Is the DuckDB version pinned everywhere that opens the file?

    Bad answer: The notebook, the job and the service each run whatever the package manager resolved. A file written by a newer version is not guaranteed to open in an older one.

03

Will it survive the big query?

Memory is the failure you will actually hit, and inside a container it rarely looks like a memory problem.

  1. Is memory_limit set explicitly, well below the container limit?

    Bad answer: It is left at the default or set equal to the container limit. DuckDB counts its own buffers, not the Python process, the dataframes or the Arrow tables in flight, so the orchestrator kills the process before DuckDB ever decides to spill. Roughly 70% of the container limit is a sane start.

  2. Where does temp_directory point, and how much room does it have?

    Bad answer: The default location in the container’s ephemeral layer. A large join spills there, fills it, and the pod is killed — which reads as an out-of-memory crash and is actually a disk problem.

  3. Does the threads setting match the CPU the container is actually given?

    Bad answer: It is left at the default, which comes from the node’s core count. A 4-core limit on a 64-core host means 64 threads spending their lives being throttled.

04

Who talks to it?

DuckDB is an engine, not a server. Whatever sits in front of it is the part of the database you are building yourself.

  1. Does any user, BI tool or dashboard connect to DuckDB directly?

    Bad answer: Yes — a BI tool pointed at a shared file. The pattern that holds is your own API in front: it owns auth, caching and rate limits, and DuckDB answers only the queries your code writes.

  2. Is every connection that only reads opened with read_only=True?

    Bad answer: Readers open the file read-write “just in case”, take the lock, and block the one writer that matters.

  3. In a multi-tenant product, where does the tenant ID in each query come from?

    Bad answer: A request parameter, or a file path built by string formatting. It must come from the authenticated session and be passed as a query parameter. Anything else is a cross-tenant data leak, and it will not look like SQL injection when it happens.

  4. When a query is slow, who finds out first?

    Bad answer: A customer. Nothing records query timings and nothing alerts. There is no warehouse console, so the only metrics are the ones your service emits.

Want this as a working doc?

I'll email you all 16 questions in plain text — paste them into a doc and work through them with your team. Nothing held back.

One email with the whole checklist. Nothing follows it. Reply and it reaches me, not a queue.

When I will tell you not to use DuckDB

  • ×Dozens of people writing ad-hoc SQL at the same moment. That is a server’s job. I would point you at ClickHouse or tell you to stay where you are.
  • ×A regulator or a contract needs roles, row-level security and an audit trail inside the database. DuckDB has no user model.
  • ×Several services writing continuously with seconds-fresh reads. DuckDB allows one writing process.
  • ×You want someone to confirm a migration you have already announced. The assessment says what the numbers say.

If that is you, the comparison to read is DuckDB vs ClickHouse or ClickHouse vs Snowflake. For the wider role, see what a data engineering consultant does.

Common questions

What does a DuckDB consultant actually do?
Three things. First, decide whether your workload is DuckDB-shaped at all: how many writers, how big the working set really is after pruning, how many queries run at once. Second, design the parts DuckDB does not give you: Parquet in object storage as the durable copy, a rebuildable database file, memory limits that sit under the container limit, a serving layer if people or an app need to query it. Third, move the workload and run both systems side by side until the numbers match.
How much does it cost to find out whether DuckDB fits?
The assessment is the Data Platform Audit pointed at that one question: $3,000 fixed, one week, 12–20 hours of my time and about two hours of yours. I only recommend it after a free scoping call and a look at your warehouse cost export, and if day one shows no credible opportunity, you pay nothing. The fee is credited in full toward a build.
What do I get at the end of the week?
A written answer to “does it fit”, with the reasons. A cost model comparing your current warehouse spend with the same workload on DuckDB and Parquet. A proof-of-concept: your heaviest real query, running on DuckDB against a copy of your own data, with timings. And a ranked list of what would have to change, with effort for each item. All of it is yours whether or not we work together again.
What if DuckDB is the wrong answer for us?
Then the report says so. I run ClickHouse in production and build on Postgres too, so I have no reason to force one engine. Sometimes the honest answer is “keep Snowflake and fix the three settings that cause most of the bill”, and the assessment will tell you which three.
Can you migrate us from Snowflake, BigQuery or Microsoft Fabric to DuckDB?
Yes, as a Data Platform Build ($15–40k depending on scope, with the assessment fee credited). The usual shape: land the data as Parquet in object storage you already pay for, run transformations as DuckDB batch jobs under Dagster or Airflow, keep the old warehouse running in parallel until every number matches, then switch the dashboards over. Most of the work is verification, not translation.
Is MotherDuck in scope?
Yes. MotherDuck can be the right call when you want DuckDB’s engine with shared access and no file to look after. The fit questions are the same ones; the answer to “who talks to it” changes. The assessment covers self-hosted DuckDB and MotherDuck side by side where both are plausible.

Bring your cost export. Leave knowing whether it fits.

The first step is a free 30-minute call. If an assessment is not worth $3,000 to you, I will say so on that call.

Book a free scoping call

Not ready to talk? Put your warehouse numbers into the cost calculator first →