Featured image of post DuckDB v2.0-alpha 发布:代号 Cyanoptera,递归 CTE 性能提升 42 倍

DuckDB v2.0-alpha 发布:代号 Cyanoptera,递归 CTE 性能提升 42 倍

DuckDB v2.0-alpha(Cyanoptera)正式发布,递归 CTE 引擎重写带来 42.6 倍性能提升,同时 DuckLabs 宣布加入 AWS。本文深度解析 v2.0 核心特性与升级指南。

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-02v2.0-cyanoptera 分支正式创建,进入特性冻结期
预计 2026年10月下v2.0 正式版发布

DuckLabs 加入 AWS

2026 年 8 月 26 日,DuckDB 母公司 DuckLabs 宣布将作为亚马逊 AWS 的新子公司加入 AWS 生态。这一举措意味着:

  • DuckDB、DuckLake、Quack 等项目继续保持开源,MIT 许可证不变
  • 由非营利组织 DuckDB Foundation 继续主导项目发展
  • 将获得 AWS 的基础设施支持,加速云原生部署
  • Foundation 将设立利益相关者咨询委员会,让更多社区代表参与治理

DuckDB v2.0 架构概览


二、核心突破:递归 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.5DuckDB 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 版本改进
ducklake0.x1.0生产级稳定性,更高吞吐
httpfs1.x2.0-alpha增强的 HTTP 日志和错误处理
iceberg1.x2.0-alpha更好的 Iceberg 表支持
spatial1.x2.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 用户升级体验。

立即行动建议

  1. 安装 alpha 版本,跑一遍你的核心查询
  2. 如果发现 bug,提交 GitHub Issue
  3. 关注 DuckDB Foundation 的 Stakeholder Advisory Board 动态
  4. 规划 v2.0 正式版的升级策略

参考资料

📺 Watch video tutorials → Olap Studio YouTube

Subscribe for more DuckDB & AI automation tutorials

使用 Hugo 构建
主题 StackJimmy 设计

⚠️ 本站为独立社区项目,与 DuckDB 基金会及 DuckDB 官方项目无任何从属、背书或赞助关系。

"DuckDB" 是 DuckDB 基金会的注册商标,本站仅以事实描述方式使用该名称。

本站内容仅供教育与社区推广用途,不构成任何商业服务。