DuckDB v2.0-alpha 发布:代号 Cyanoptera,递归 CTE 性能提升 42 倍
💰 变现建议:v2.0 带来革命性性能提升,企业可基于此构建实时递归查询服务(如组织架构分析、供应链路径追踪),按查询量收费或作为 SaaS 数据分析平台的核心引擎,月费 99-999 元不等。
一、重大新闻:DuckDB v2.0-alpha 正式发布
2026 年 9 月 2 日,DuckDB 团队宣布 DuckDB v2.0-alpha 正式发布,内部开发代号 Cyanoptera(青琉璃)。这是 DuckDB 历史上最具里程碑意义的版本之一,不仅带来了多项底层引擎重构,还宣告了 DuckLabs 加入 AWS 的重大战略调整。
关键时间线
| 日期 | 事件 |
|---|---|
| 2026-08-17 | 发布 DuckDB v2.0 预览版 |
| 2026-08-20 | 发布新一代解析器技术文章 |
| 2026-08-25 | 发布递归 CTE 性能优化深度技术文章 |
| 2026-08-26 | 宣布 DuckLabs 加入 AWS |
| 2026-09-02 | v2.0-cyanoptera 分支正式创建,进入特性冻结期 |
| 预计 2026年10月下 | v2.0 正式版发布 |
DuckLabs 加入 AWS
2026 年 8 月 26 日,DuckDB 母公司 DuckLabs 宣布将作为亚马逊 AWS 的新子公司加入 AWS 生态。这一举措意味着:
- DuckDB、DuckLake、Quack 等项目继续保持开源,MIT 许可证不变
- 由非营利组织 DuckDB Foundation 继续主导项目发展
- 将获得 AWS 的基础设施支持,加速云原生部署
- Foundation 将设立利益相关者咨询委员会,让更多社区代表参与治理

二、核心突破:递归 CTE 性能提升 42.6 倍
DuckDB v2.0 最引人注目的性能改进来自于递归 CTE(公共表表达式)引擎的完全重写。根据官方基准测试,在一个包含 100 万个边和 10 万个节点的可达性查询中,v2.0 的 Median 运行时间从 v1.5.5 的 4.051 秒降至 0.095 秒,提升了 42.6 倍,且 SQL 代码无需任何修改。
什么是递归 CTE?
递归 CTE 是 SQL 中处理层级数据、图遍历、树形结构的核心工具。典型应用场景包括:
- 组织架构中的上级-下级关系查询
- 供应链中的路径追踪
- 社交网络中的朋友推荐
- 文件系统中的目录遍历
-- 经典的递归 CTE:查找组织架构中的所有下级
WITH RECURSIVE subordinate AS (
-- 锚点:找到直接下属
SELECT employee_id, manager_id, name, 1 AS level
FROM employees
WHERE manager_id = 100
UNION ALL
-- 递归:找到下属的下属
SELECT e.employee_id, e.manager_id, e.name, s.level + 1
FROM employees e
INNER JOIN subordinate s ON e.manager_id = s.employee_id
)
SELECT * FROM subordinate ORDER BY level;
v1.5.5 的问题:每次迭代都重建
在 DuckDB v1.5.5 及更早版本中,递归 CTE 的执行引擎存在一个根本性问题:每次递归迭代都会重建整个执行管道。
想象一下你在做图的深度优先搜索(DFS):
- 你有 100 万个边的图(建表耗时)
- 每轮迭代都要重新扫描这 100 万条边
- 经过 20 轮迭代后,你实际上扫描了 2000 万条边!
这就是为什么 v1.5.5 在处理大规模图数据时如此缓慢。
v2.0 的革命:保留跨迭代的状态
v2.0 引入了三个核心创新:
1. 生命周期分离:调用级 vs 纪元级
┌─────────────────────────────────────────────────────┐
│ DuckDB v2.0 递归 CTE 执行模型 │
├─────────────────────────────────────────────────────┤
│ Query Plan 层(整个查询计划生命周期保留) │
│ ├── 物理算子树(一次构建,永久保留) │
│ ├── 不可变调度投影(schedule projections) │
│ └── 可复用 Pipeline 执行器池 │
├─────────────────────────────────────────────────────┤
│ Recursive Invocation 层(整个递归调用保留) │
│ ├── 累积的重复消除哈希表(保留!) │
│ ├── 可重复的基础表构建(保留!) │
│ └── 键控状态(keyed state) │
├─────────────────────────────────────────────────────┤
│ Epoch(单次递归迭代)层(每轮重置) │
│ ├── 当前 Frontier(边界集合) │
│ ├── 候选结果袋(candidate bag) │
│ └── 临时缓冲区 │
└─────────────────────────────────────────────────────┘
简单说,v2.0 将"不变的建表工作"和"变化的边界扫描工作"分离开来:
- 不变的(如扫描基础边表、构建哈希索引)→ 只在第一次构建,后续复用
- 变化的(如扫描当前 frontier、探测哈希表)→ 每轮执行
2. 自适应执行模式:内联 vs 调度
v2.0 根据 frontier 的实际大小动态选择执行策略:
| Frontier 大小 | 执行模式 | 说明 |
|---|---|---|
| 小规模(few chunks) | 内联执行 | 单线程直接驱动,避免任务调度开销 |
| 大规模(many chunks) | 调度执行 | 多 worker 并行,充分利用多核 |
import duckdb
# 安装 alpha 版本
# pip install --pre duckdb
con = duckdb.connect(":memory:")
# 创建 100 万条边的图
con.execute("""
CREATE TABLE edges AS
SELECT
n AS src,
(n % 100000) + 1 AS dst
FROM generate_series(1, 1000000) AS t(n)
""")
# 递归查询:从节点 1 出发可达多少个节点
result = con.execute("""
WITH RECURSIVE reachable AS (
SELECT 1 AS node
UNION ALL
SELECT e.dst
FROM edges e
INNER JOIN reachable r ON e.src = r.node
)
SELECT COUNT(DISTINCT node) AS reachable_count
FROM reachable
""").fetchone()
print(f"可达节点数: {result[0]}")
3. USING KEY … UNION 语义改进
v2.0 引入了一种新的语义:USING KEY ... UNION 现在只将真正变化的键传递给下一轮迭代,而不是所有候选结果。这使得递归在状态收敛时能够提前终止。
-- 最短路径查询示例
WITH RECURSIVE shortest_path AS (
SELECT
start_node AS node,
0 AS distance,
ARRAY[start_node] AS path
FROM nodes
WHERE node_id = 1
UNION
SELECT
e.dst_node,
sp.distance + 1,
sp.path || e.dst_node
FROM edges e
INNER JOIN shortest_path sp ON e.src_node = sp.node
WHERE sp.distance < 10 -- 限制深度
)
SELECT * FROM shortest_path;
性能对比表
| 指标 | DuckDB v1.5.5 | DuckDB v2.0-alpha | 提升 |
|---|---|---|---|
| 递归 CTE 中位数运行时间 | 4.051 秒 | 0.095 秒 | 42.6× |
| 边表扫描次数 | ~197 亿行(~19,718 次完整扫描) | 100 万行(1 次) | 19,718× |
| 内存分配模式 | 每轮重建 | 首次构建后复用 | 显著降低 |
| Frontier 自适应 | 固定调度 | 内联/调度动态切换 | 更优资源利用 |
三、v2.0 其他重要特性
1. 新一代 SQL 解析器
DuckDB v2.0 引入了完全重写的解析器,由 Daniël ten Wolde 主导开发。新解析器:
- 提供更清晰的错误消息
- 支持更多 SQL 标准的 edge cases
- 改进了对复杂表达式的解析能力
- 为未来的语法扩展奠定基础
2. Quack 远程协议增强
Quack 是 DuckDB 的客户端-服务器协议,v2.0 中得到了显著增强:
- 更高的查询吞吐量
- 更好的客户端-服务器双向通信
- 改进的错误处理和恢复机制
3. 扩展版本升级
| 扩展 | v1.x 版本 | v2.0 版本 | 改进 |
|---|---|---|---|
| ducklake | 0.x | 1.0 | 生产级稳定性,更高吞吐 |
| httpfs | 1.x | 2.0-alpha | 增强的 HTTP 日志和错误处理 |
| iceberg | 1.x | 2.0-alpha | 更好的 Iceberg 表支持 |
| spatial | 1.x | 2.0-alpha | 空间查询性能优化 |
4. ADBC 支持
v2.0 新增了对 duckdb:// URI 方案的支持,以及 ADBC Statistics API,使 DuckDB 更容易集成到数据工程生态中。
四、如何安装和试用 v2.0-alpha
命令行客户端
# Linux / macOS
curl https://install.duckdb.org | DUCKDB_VERSION=~/.duckdb/cli/latest/duckdb
# 验证版本
~/.duckdb/cli/latest/duckdb -c "SELECT version() AS version;"
输出:
┌────────────────────┐
│ version │
│ varchar │
├────────────────────┤
│ v2.0.0-alpha39998 │
└────────────────────┘
Python
pip install --pre duckdb --upgrade
import duckdb
print(duckdb.version())
# 输出: 1.6.0.dev379 (with duckdb 2.0.0-alpha39998)
Java
Java 客户端也已提供 alpha 版本,支持流式查询结果(chunked query results)。
五、升级建议与注意事项
⚠️ Alpha 版本的定位
官方明确指出:DuckDB alpha 客户端已准备好用于生产环境,但主要目的是让用户尽早发现 bug。这意味着:
- ✅ 可以安全地安装和运行现有查询
- ✅ 大多数查询会正常运行,部分会更快
- ⚠️ 少数查询可能会报错——这正是团队希望发现的!
- 🔧 遇到问题请提交 GitHub Issue,附上可复现的示例
升级检查清单
| 检查项 | 说明 |
|---|---|
| 基础查询测试 | 验证 SELECT、JOIN、聚合等核心操作 |
| 递归 CTE 测试 | 如果业务依赖递归查询,这是重点测试对象 |
| 扩展兼容性 | 测试 httpfs、iceberg、ducklake 等扩展 |
| 客户端测试 | 验证 Python/Java/Node.js 等客户端 |
| 性能基准 | 对比 v1.5.5 的性能表现 |
回退方案
如果遇到问题,可以随时回退到稳定版本:
# 回退到 v1.5.5
pip install duckdb==1.5.5
# 或安装 LTS 版本
pip install duckdb==1.4.5
六、总结
DuckDB v2.0-alpha(Cyanoptera)的发布标志着 DuckDB 从一个高性能的分析型数据库引擎,向更成熟的企业级数据平台迈出了关键一步。递归 CTE 的 42.6 倍性能提升不仅是一个数字游戏——它让原本在 DuckDB 中难以实用的图查询场景(如社交网络分析、供应链追踪、权限层级计算)变得真正可行。
加上 DuckLabs 加入 AWS 的战略调整,DuckDB 的未来发展前景令人期待。v2.0 正式版预计将在 2026 年 10 月下旬发布,届时值得所有 DuckDB 用户升级体验。
立即行动建议:
- 安装 alpha 版本,跑一遍你的核心查询
- 如果发现 bug,提交 GitHub Issue
- 关注 DuckDB Foundation 的 Stakeholder Advisory Board 动态
- 规划 v2.0 正式版的升级策略