SQLite 的形态,数据仓库的活
DuckDB 是一个进程内的分析型数据库。它像 SQLite 一样作为单个依赖链入你的程序,但面向的是相反的负载:对列式数据跑快速聚合查询,而非逐行的事务读写。人们爱用的那句标签是「分析版 SQLite」,而这次它配得上这个类比。没有服务端要跑,没有集群要开,也没有装载数据的繁文缛节。你把 SQL 指向磁盘上的文件,它就给出答案。
一行就说清它为何吸引人
README 开头就摆出来了,两条查询道尽全部主张:
SELECT * FROM 'myfile.csv';
SELECT * FROM 'myfile.parquet';
没有 CREATE TABLE,没有导入作业,不必先把几个 G 拷进数据库。DuckDB 就地读取 Parquet 和 CSV,把过滤与投影下推进扫描,只物化你的查询真正需要的部分。对那些卡在「表格已经塞不下」与「仓库要走工单才能开」之间的分析师,这一步直接省了。文件就是表。
你实际得到什么
- 一个向量化的列式执行引擎,这正是百万行聚合在笔记本上也能交互式响应的原因。
- 一套远超基础的 SQL 方言:窗口函数、相关与嵌套子查询、复杂类型(数组、结构体、map)、排序规则,以及一组削减样板的「friendly SQL」扩展。
- Python、R、Java、WebAssembly 客户端外加一个独立 CLI,并与 pandas、dplyr 深度集成,能直接嵌进你已有的 notebook。
- 直读 CSV、Parquet、JSON,并有扩展系统支持更多格式与数据源。
安装
Python 包是最常见的入口:
pip install duckdb
独立 CLI 在 Homebrew 上:
brew install duckdb
R、Java、Node、Wasm 以及各平台的预编译 CLI 二进制,见官方安装页。DuckDB 采用 MIT 许可,这些都没有门槛。
第一批查询
在 Python 里,零设置地查询一个 DataFrame 或一个文件:
import duckdb
duckdb.sql("SELECT count(*), avg(amount) FROM 'sales.parquet'")
duckdb.sql("SELECT * FROM my_pandas_df WHERE region = 'EU'")
在 CLI 里,同样的 SQL 直接作用于文件;当你希望结果留在磁盘上、不只活在内存里时,可以持久化到一个 .duckdb 文件。
何时适用,何时不适
把 DuckDB 用在本地分析、notebook 探索、嵌入式报表,以及啃 Parquet 和 CSV 的 ETL 上。当数据能装进一台机器、且工作偏读、偏聚合时,它就是对的工具。
它不是事务型存储。DuckDB 作为单进程运行,同一时刻只有一个读写连接,所以它不适合来自众多客户端的高并发写入;那种场景该用行存,如 SQLite、Turso 或 Postgres。它也不是多用户服务端仓库:没有一个常驻服务供数十名分析师并发连接,而那正是 ClickHouse 这类系统的位置。又因为大型 join 这类操作可能很吃内存,超大负载需要一台为之配置的机器,或干脆换一个引擎。
DuckDB 与分析型替代品
| DuckDB | Polars | ClickHouse | DataFusion | |
|---|---|---|---|---|
| Stars | 38,720 | 38,721 | 47,919 | 8,861 |
| 语言 | C++ | Rust | C++ | Rust |
| 许可 | MIT | MIT | Apache-2.0 | Apache-2.0 |
| 运行形态 | 进程内数据库 | 进程内 DataFrame | 服务端 | 进程内查询引擎(库) |
| 最擅长 | 对本地文件跑 SQL | DataFrame 流水线 | 大规模服务端 OLAP | 自建查询引擎 |
计数取自 GitHub,截至 2026-06。Polars 在气质上重叠最多:它同样是单机、快,但它是带 Python 与 Rust API 的 DataFrame 库,而非 SQL 数据库,所以选择主要看你是用 SQL 思考还是用方法链思考。ClickHouse 是当分析超出一台机器、需要一个支持并发用户的真正服务端时的答案。DataFusion 在更底一层:它是一套 Rust 查询引擎工具箱(Rust 数据生态里有若干项目构建于其上),而不是直接交给分析师用的东西。DuckDB 的赛道是「对本地文件跑 SQL」这个甜区,而它独占了这个甜区。
常见问题
DuckDB 就是分析版 SQLite 吗? 架构上押韵:进程内、单文件、零配置;但它的引擎是为聚合查询设计的列式、向量化引擎,而 SQLite 是为事务设计的行式引擎。同样的便利,相反的负载。
DuckDB 需要服务端吗? 不需要。它在你的进程内运行,没有要启动、连接或常驻的东西。
DuckDB 能取代我的数据仓库吗? 对单机、偏读的分析,往往可以。对并发多用户访问、或装不进一台机器的数据,不行;那是服务端 OLAP(如 ClickHouse)的地盘。
DuckDB 能用于生产吗? 能。它采用 MIT 许可、已过 1.0,作为嵌入式分析引擎和数据管线的一环被广泛使用。