Skip to content
Home › SQL Comparisons › DuckDB vs SQLite
Comparison · Database Engines

DuckDB vs SQLite

DuckDB and SQLite are both in-process databases with no server, but they are built for different jobs: DuckDB is a columnar engine for analytical queries over large tables and files such as Parquet and CSV, while SQLite is a row-oriented engine for transactional application storage. Pick DuckDB to analyse data; pick SQLite to store an application's records.

Last verified October 2026. Versions checked: DuckDB 1.5.6 (stable) and 1.4.5 (LTS), SQLite 3.53.4. Licensing and features change; check the official sources for the latest details.

Quick verdict

Short answer

Choose DuckDB when the job is analysis: aggregating, joining and filtering large tables, or querying Parquet, CSV and JSON files directly from a notebook, script or data pipeline. Choose SQLite when the job is application storage: a mobile or desktop app, an embedded device, a local cache or a single-file document format, where the workload is many small reads and writes of individual rows. The two work well together: DuckDB's sqlite extension can attach an SQLite file and query or write it directly.

How we know: This comparison is research-based: storage model, concurrency, file formats, client APIs, versions and licences were checked against duckdb.org and sqlite.org in October 2026. We have not run performance tests, so no speed claims are made beyond what each project documents about its own design.

DuckDB is an in-process analytical (OLAP) database. Its documentation says it runs completely embedded within a host process, with no server software to install, and uses a columnar-vectorised query engine that processes large batches of values at a time. It has no external dependencies, runs on Linux, macOS and Windows on x86 and ARM, and also runs in the browser through DuckDB-Wasm. DuckDB is released under the MIT License, with the intellectual property held by the DuckDB Foundation. The release calendar on duckdb.org lists 1.5.6 (28 September 2026) as the latest stable release, 1.4.5 as the current Long-Term Support release, and 2.0.0 planned for 21 October 2026.

SQLite is a C library that implements a self-contained, serverless SQL database engine: the application reads and writes a single database file directly. It is designed for transactional application storage and is built into many operating systems and language runtimes; sqlite.org notes that Tcl and Python both ship with SQLite built in. SQLite is in the public domain. The latest release on sqlite.org is 3.53.4 (24 July 2026).

Side by side

AspectDuckDBSQLite
Workload it is designed for Analytical (OLAP): scans, aggregations and joins over large portions of a table Transactional (OLTP) application storage: many small reads and writes of individual rows
Storage model Columnar, stored in compressed row groups in a single database file; vectorised execution Row-oriented B-tree pages in a single database file
Concurrency One process may read and write (multiple writer threads, MVCC plus optimistic concurrency control), or many processes may open the file read-only Unlimited simultaneous readers, one writer at a time per file; WAL mode lets readers and the writer run concurrently
Reading external files Queries Parquet, CSV and JSON files (local, HTTPS or S3) directly with SQL; can attach SQLite and PostgreSQL databases No Parquet reader; CSV is imported through the sqlite3 shell .import command or application code
Data types Strict typing plus nested types (LIST, ARRAY, STRUCT, MAP, UNION), HUGEINT, INTERVAL, UUID Flexible typing (type affinity) by default; STRICT tables opt in to type checking; no dedicated date type
Language bindings CLI, Python, Go, Java, Node.js, C/C++, R, Rust, ODBC, Wasm and more C API at the core; bindings in most languages, and built into Python and Tcl
Licence MIT License Public domain
Release model Frequent releases; every other release is LTS (one year of community support) Long-established, stable file format and API
Main trade-off Built for scans and aggregates, not for many small concurrent updates; indexes add write overhead Built for row-at-a-time access; large analytical scans are not its design goal

Key differences

Columnar analytics versus row-oriented transactions

This is the difference that decides most choices. DuckDB stores each column separately in compressed row groups and executes queries on batches of values (vectors). Its documentation contrasts this with row-by-row systems such as SQLite and PostgreSQL and says it targets analytical workloads: complex, relatively long-running queries that read a large share of the stored data. DuckDB automatically keeps min-max indexes (zonemaps) per column block so that filters can skip blocks, and it applies compression by default to persistent databases.

SQLite stores each table as a B-tree of rows, which suits looking up, inserting and updating individual records. sqlite.org does list data analysis as an appropriate use (importing CSV and slicing it with SQL in the sqlite3 shell), but its design centre is application storage. In our view, if most of your queries are GROUP BY summaries over millions of rows, DuckDB is the better fit; if most are "fetch or update this one record", SQLite is.

DuckDB's indexing guide is explicit about the trade-off: changes to indexed tables are slower because of index maintenance, and it advises against defining explicit indexes unless queries are highly selective. That makes it a poor substitute for SQLite as the live store behind an application with many small writes.

Concurrency: who can write, and when

Both are single-file, in-process engines, but their rules differ. DuckDB allows either one process that reads and writes, or many processes that open the file read-only. Within that one process, several threads can write, using MVCC with optimistic concurrency control, so two transactions that change the same rows at the same time get a conflict error. For writes from several processes, the DuckDB docs point to the Quack remote protocol (described as beta in the 1.5 series) or to DuckLake with PostgreSQL as its catalog.

SQLite allows any number of processes to read and one to write at a time per database file, coordinated with file locks; WAL mode lets readers continue while a write is in progress. sqlite.org advises a client/server engine when many writers must write at the same instant. Both projects warn about using their files on network or shared file systems.

Querying files directly: Parquet, CSV and JSON

DuckDB can query data files in place, without loading them first. Parquet, JSON and HTTP/S3 support are implemented as extensions, and a file path can be used as if it were a table. Glob patterns read many files at once.

-- DuckDB: query Parquet and CSV files directly
SELECT * FROM 'sales/*.parquet';
SELECT * FROM read_csv('flights.csv');

-- DuckDB: write a query result to Parquet
COPY (SELECT * FROM orders) TO 'orders.parquet' (FORMAT parquet);

SQLite has no built-in Parquet support. CSV is usually loaded through the sqlite3 command-line shell, which creates the table from the header row if it does not already exist, or through application code.

-- SQLite (sqlite3 shell): import a CSV file into table flights
.import --csv flights.csv flights

DuckDB can also read and write SQLite files through its sqlite extension, which is a practical way to run analytical queries against an existing SQLite application database. DuckDB notes that SQLite is weakly typed, so mismatched values raise errors unless you set sqlite_all_varchar.

-- DuckDB: attach an SQLite database file
ATTACH 'app.db' (TYPE sqlite);
USE app;
SELECT country, count(*) FROM customers GROUP BY ALL;

SQL dialect and typing

DuckDB's dialect closely follows PostgreSQL and adds "friendly SQL" shortcuts documented on duckdb.org, such as GROUP BY ALL, SELECT * EXCLUDE (...), queries that start with FROM, and SUMMARIZE for quick column statistics. Typing is strict, and it has nested types (LIST, STRUCT, MAP) that map naturally to Parquet and JSON data.

-- DuckDB
FROM orders SELECT * EXCLUDE (internal_notes) LIMIT 10;
SELECT region, sum(total) FROM orders GROUP BY ALL;

-- SQLite: list every column explicitly; GROUP BY names the columns
SELECT region, sum(total) FROM orders GROUP BY region;

SQLite uses flexible typing in ordinary tables: a declared type sets an affinity, and values that cannot be converted losslessly are stored as given. STRICT tables (since 3.37.0) enforce a small set of types. Dates are stored as text, real or integer values and handled with functions such as date() and strftime().

Language bindings, deployment and release cadence

Both are libraries you link into your program. DuckDB's install page lists the CLI, Python, Go, Java, Node.js, C/C++, R, Rust, ODBC and WebAssembly clients, and its Python client can query pandas data without copying it. SQLite is available in almost every language and is often already present: sqlite.org notes it is built into Python and Tcl, and it ships with many operating systems.

DuckDB moves quickly. Since 1.4.0, every other release is an LTS release with one year of community support, and duckdb.org lists 2.0.0 as planned for 21 October 2026. Its storage format is backward compatible from 0.10 onwards (newer versions read older files), while forward compatibility is best effort. SQLite is a long-established project with a stable file format. If the file itself is a long-lived deliverable, that stability is a point in SQLite's favour.

Pricing and licensing

DuckDB is free and open source under the MIT License; there is no paid edition of the engine. duckdb.org notes that extended support for LTS releases beyond the one-year community window is available through DuckDB Labs, a commercial company; no prices are published for it. Hosted services built on DuckDB are offered by separate companies and priced by them.

SQLite is in the public domain and free for any use. Hwaci, the company that employs the SQLite developers, sells a Warranty of Title for organisations that need a formal document; prices are not listed on the copyright page.

We describe licence terms only. If licence obligations matter for software you distribute, take your own legal advice.

Pricing checked on the vendors' official pages on 7 October 2026. Prices change; confirm before buying.

Where each one leads

DuckDB strengths

  • Columnar, vectorised engine designed for analytical queries over large tables
  • Queries Parquet, CSV and JSON files directly, including over HTTPS and S3, and writes Parquet with COPY
  • Can attach SQLite and PostgreSQL databases and query or write them with DuckDB SQL
  • PostgreSQL-like dialect with conveniences such as GROUP BY ALL, EXCLUDE and nested types
  • MIT licence, no dependencies, and clients for Python, R, Java, Node.js, Go, Rust, Wasm and more

SQLite strengths

  • Designed for transactional application storage with many small reads and writes
  • Public domain, with no licence obligations
  • Built into Python, Tcl, mobile platforms and many operating systems
  • Long-established, stable single-file format suitable as an application file format
  • WAL mode lets readers continue during writes, and any number of processes can read

Limitations

DuckDB limitations

  • Only one process can open a database file for writing; other processes are read-only
  • Optimistic concurrency control raises conflict errors when transactions change the same rows at once
  • Indexes and constraints slow down writes and loads; not designed for high-rate single-row updates
  • Fast release cadence; plan upgrades around LTS releases, and older versions may not read newer files
  • Multi-process writing needs the Quack protocol (beta in 1.5) or DuckLake with a separate catalog database

SQLite limitations

  • Row-oriented storage is not designed for large analytical scans and aggregations
  • No built-in Parquet support; CSV loading goes through the shell or application code
  • Flexible typing in ordinary tables unless you use STRICT tables
  • One writer at a time per database file, and not for use over network file systems

When to choose each

Choose DuckDB if

  • You analyse data in notebooks, scripts or pipelines and want SQL over Parquet, CSV or JSON files
  • Queries are mostly aggregations and joins over millions of rows rather than single-row lookups
  • You want to run analytical queries over an existing SQLite or PostgreSQL database without exporting it
  • You need nested data types or Parquet output for a data lake

Choose SQLite if

  • You need the local database behind a mobile, desktop or embedded application
  • The workload is many small inserts, updates and lookups of individual rows
  • You want a single, stable file format to ship, exchange or keep for years
  • You need the database to be present with no extra dependency, for example in Python's standard library

When neither is right

Final recommendation

Bottom line

DuckDB and SQLite are complementary rather than rivals. SQLite is the default for storing an application's data on one device: it is transactional, tiny, everywhere and public domain. DuckDB is the default for analysing data in-process: columnar storage, vectorised execution and direct Parquet and CSV reading make it a fit for notebooks, pipelines and local analytics, and its sqlite extension can query your SQLite files when you need reports. If you are choosing one database for an app, pick SQLite; if you are choosing one tool to crunch data files, pick DuckDB.

Frequently asked questions

Is DuckDB a replacement for SQLite?

Not for most application storage. DuckDB's own documentation describes it as built for analytical workloads, and it allows only one process to write a database file. SQLite remains the usual choice for transactional, row-at-a-time storage in apps. Both are in-process and serverless, but they target different workloads.

Can DuckDB read an SQLite database?

Yes. DuckDB's sqlite extension can attach an SQLite file with ATTACH 'file.db' (TYPE sqlite); and then read, insert, update and delete data in it. Because SQLite is weakly typed, values that do not match the mapped column type raise errors unless you set sqlite_all_varchar.

Can SQLite read Parquet files?

Not with the standard SQLite distribution. To query Parquet with SQL in-process, DuckDB reads it directly, for example SELECT * FROM 'data.parquet';.

Can several processes write to a DuckDB file at the same time?

Not directly. DuckDB documents two modes: one process that reads and writes, or many processes that read only. For multi-process writes it points to the Quack remote protocol, described as beta in the 1.5 series, or to DuckLake with PostgreSQL as the catalog database.

Are DuckDB and SQLite free for commercial use?

Yes. DuckDB is under the MIT License and SQLite is in the public domain. Neither has a paid edition of the engine; commercial support is available separately for both.

Sources

Checked October 2026.

How we research comparisons: our editorial method.

More comparisons

Browse all SQL comparisons or the tools directory.