DuckDB 与 SQLite 对比:嵌入式数据库怎么选
SQLite 与 DuckDB 都是免服务器的嵌入式数据库,但一个为事务而生,一个为分析而生。本文从存储架构、查询处理、并发、性能与数据科学集成全面对比。
直接回答:SQLite 是全球部署量最大的数据库引擎,行式存储 + 完整 ACID 事务,擅长应用内本地存储与读写混合场景;DuckDB 是新一代分析型嵌入式数据库,列式存储 + 向量化执行,专为大数据集上的聚合分析而生。 选择的分水岭是负载类型:OLTP 选 SQLite,OLAP 选 DuckDB。
两者是什么
SQLite:广泛用于嵌入式和本地应用。单文件、零配置、事务完备,是"应用文件格式"的事实标准。
DuckDB:2019 年前后兴起,定位"分析领域的 SQLite"。直接查询 CSV/Parquet,一条 SQL 聚合几 GB 数据,数据科学圈迅速走红。
存储架构:行与列的分野
- SQLite 行式存储:整行连续存放,按主键取一条记录飞快,写入也高效;
- DuckDB 列式存储:每列独立存放,
SUM(amount)只扫 amount 一列,压缩率高、CPU 缓存友好,有利于分析查询;代价是单行更新代价大。
查询处理
SQLite 的查询引擎为毫秒级点查优化;DuckDB 用向量化执行(一批一批处理数据而非一行一行),配合多线程并行扫描,适合聚合、窗口和大表关联,需比较具体执行计划。
# DuckDB:聚合 Parquet 数据,耗时取决于数据与硬件
con.sql("SELECT region, SUM(amount) FROM 'sales.parquet' GROUP BY region")
并发与事务
SQLite:完整 ACID,多读单写(WAL 模式下读写可并行),多进程读友好。
DuckDB:单进程内多线程读没问题,单进程内也可并发事务;原生文件不支持多个独立进程直接并发写,远程或协调方案须单独评估——它是分析引擎不是服务数据库。
数据类型与函数
SQLite 类型系统宽松(动态类型),函数集精简;DuckDB 类型严格且丰富(数组、结构体、地图、区间),分析函数(窗口、分位数、时间序列)一应俱全,提供正则和 JSON 函数;地理能力通常需安装并加载 spatial 扩展。
性能优化手段
- SQLite:索引、WAL 模式、合理 page_size、批量事务提交;
- DuckDB:Parquet 列裁剪、谓词下推、
memory_limit与外排序、物化中间表。
数据科学工作流
DuckDB 支持与 pandas/Polars/Arrow 交换数据,是否零拷贝取决于接口与类型,直接查文件即开即用,是笔记本上的"迷你数仓";SQLite 与数据科学的交集主要在"应用产生的数据落地"。
维护
静态关闭的数据库可复制文件;运行中的 SQLite 应用 backup API 等一致性方案,DuckDB 应 checkpoint 并关闭写连接后复制,不能漏掉 WAL。SQLite 有 VACUUM 整理碎片;DuckDB 文件随分析任务生命周期管理即可。
一句话决策
| 场景 | 选 |
|---|---|
| App 本地存储、嵌入式配置、边缘设备 | SQLite |
| 日志/事件/报表的即席分析、数据管道中间层 | DuckDB |
| 既要事务又要分析 | SQLite 落地 + DuckDB 分析(各用其长) |
常见问题(FAQ)
Q:能用 DuckDB 做 Web 应用数据库吗?
A:不建议。它支持事务与单进程内并发写,但原生文件的访问模型不同于多客户端服务数据库,那是 PostgreSQL/SQLite 的领域。
Q:DuckDB 文件能给多人共享吗?
A:只读共享可以(挂载只读、多进程读)。协作写入请上真正的数据库服务。
Q:为什么 DuckDB 查 CSV 比导入 SQLite 再查还快?
A:列裁剪 + 向量化 + 并行扫描,而且省掉了导入这一步本身。
官方参考
本文基于官方文档整理,未进行运行时或性能测试。示例中的业务函数、数据模型和部署地址需结合项目补全;局部片段不等同于完整生产应用。