← 学习中心

DuckDB 分析型数据库(Analytics Database):把数据仓库装进笔记本

一天被下载超过一百万次、五个人的创始团队没融资就撑了五年,2026 年 8 月 26 日被 AWS 整队收编——DuckDB 凭什么?答案藏在「列存 + 向量化 + 进程内嵌入式」这三件套里:一台笔记本,也能跑亿级行的分析 SQL。

先看一条今天的新闻:2026 年 8 月 26 日,AWS 官宣 DuckDB 背后的公司 DuckLabs 加入 AWS,9 月初生效。这个每天被下载超过 100 万次的开源数据库,靠 5 年 bootstrap 做到 30 多人规模,没拿一轮风投。它到底是什么?一句话:DuckDB 是一个进程内(in-process)的分析型数据库——如果说 SQLite 是「嵌入应用程序的 PostgreSQL」,那 DuckDB 就是「嵌入应用程序的数据仓库」。

OLTP 与 OLAP 是两回事

数据库世界有一条分界线。一侧是联机事务处理(OLTP):下单、扣库存、转账,特点是每次读写一两行,要求低延迟和高并发,PostgreSQL、MySQL 都在这侧。另一侧是联机分析处理(OLAP):算全年的销售报表、给一亿行日志做聚合,特点是每次扫大量行、只碰少数几列。行存数据库做分析查询会把整张表从磁盘搬进内存,哪怕你只要 3 列——数据量一大就崩。DuckDB 从第一行代码起就站在 OLAP 这侧。

同一个查询,行存与列存各读多少数据 行存(OLTP 布局) 列存(DuckDB 布局) 行1:全列 行2:全列 行3:全列 行N:全列 读 3 列也要搬全表 IO = 100 列 × N 行 列A 列B 列C 其余列不读 只扫需要的列 IO = 3 列 × N 行 同列类型一致 压缩率更高 字典/游程编码 CPU 缓存友好

图1:分析查询「SELECT 3 列做聚合」在两种存储布局下的 IO 差异

三件套:列存、向量化、进程内

列存解决「读多少」,向量化执行(vectorized execution)解决「怎么算」。DuckDB 不逐行解释执行,而是把一列数据切成几千行一批的向量,一个算子一次处理一批——函数调用、分支判断的开销被摊薄,循环紧凑到 CPU 分支预测和缓存都舒服。第三件是进程内嵌入式:没有独立的服务进程,数据库就是一个库文件,`pip install duckdb` 之后直接在 Python 里 `duckdb.sql("...")`,没有网络往返、没有连接池、没有配置文件,数据库文件就是一个 `.duckdb` 单文件,拷走就能用。

DuckDB 进程内查询链路:数据原地进分析引擎 CSV / Parquet read_csv_auto read_parquet / S3 列式扫描器 只读所需列 谓词下推过滤 向量化算子 聚合 / JOIN / 窗口 按向量批次执行 结果 DataFrame 全程在同一进程内:无服务、无网络往返、零配置部署

图2:从文件到结果的完整链路,跑在分析与应用同一个进程里

对数据分析师来说,最直接的体感是:不用先把 CSV 导进数据库。DuckDB 可以对磁盘上的 CSV、Parquet、JSON 文件直接发 SQL,装上 httpfs 扩展还能查询 S3 桶里的远端文件;在 Python 里,一个 pandas DataFrame 也能当表查。SQL 该有的都有——窗口函数、CTE、各种 JOIN、完整的事务(ACID)。团队后来又推出了 DuckLake:一种 lakehouse 表格式,用 SQL 管理躺在 Parquet 数据湖里的表。今天的新闻里,DuckDB、DuckLake、Quack 都继续以 MIT 许可开源,由 DuckDB Foundation 托管——云巨头买走了团队,但没买走社区。

本节你将能

  • 说清 OLTP 与 OLAP 的分界,以及行存/列存各自的适用面;
  • 解释列存为何让分析查询少读一个数量级的数据;
  • 用 DuckDB 直接对 CSV/Parquet 发 SQL,并理解向量化执行为什么快;
  • 判断自己的场景该选嵌入式 DuckDB 还是 client/server 数据仓库。
---
DuckDB 分析型数据库(Analytics Database):把数据仓库装进笔记本 | 必学必会