返回

文章详情

DuckDB v2.0 的预览

Hacker News2026年8月17日 13:46

Mark Raasveldt 和 Hannes Mühleisen 2026-08-17 | 15分钟 综述: DuckDB v2.0 将于今秋发布。在这篇文章中,我们预览了它的主要功能: DuckDB 作为服务器、触发器、VARIANT 类型、异步 I/O、新的 SQL 解析器、新的存储格式等。DuckDB v2.0 将被命名为“Cyanoptera”,源自肉桂蓝头鸭(Anas cyanoptera),这是一种生长在西美洲的醒目的红棕色鸭子。我们并不是轻易进行主要版本升级,这不仅仅是仪式:v2.0 版本包含新的 SQL 解析器、新的默认存储格式、重新设计的 C API,以及少量经过仔细选择的重大更改。但最重要的是,这是一个功能发布,自我们在三月发布 v1.5 以来,逾 10,000 次提交的成果。去年是湖屋的年度,而这一版本开启了 DuckDB 作为服务器的一年。如果你更喜欢观看而不是阅读,我们在 DuckCon #7 的“Duck 状态”演讲中预览了许多这些功能。DuckDB 的发展速度相当快,我们只能在这里覆盖少量的更改。将所有新功能浓缩成一个简短的列表总是会争论什么可以包含,没错,我们知道接下来的内容在技术上是一个列表(即“即将到来的 DuckDB v2.0 的十个功能,第八个会让你感到震惊”)。我们对这种格式并不感到自豪,但它有效,反正这是:从 SQL 级别的功能开始,逐渐深入到引擎。 1. DuckDB 作为服务器:Quack 和 CONNECT DuckDB 自第一天起就是一个进程内数据库。但人们持续不断地要求我们提供客户端/服务器模式,我们终于妥协了。Quack 扩展实现了 DuckDB 的原生协议,用于与其他 DuckDB 进行通信。它在 DuckCon #7 之前不久作为预览版本发布,在 v2.0 中正式发布,并且是 DuckDB 未来发展的重要组成部分:任何 DuckDB 进程都可以通过网络服务其数据库,任何其他 DuckDB 都可以连接到它并使用新的 CONNECT 语句路由查询。例如:quack: DuckDB 客户端 ATTACH 'quack:server.example.com' AS qk ( TOKEN 'my_token' ); CONNECT qk ; SELECT count ( * ) FROM events ; -- 在服务器上执行,--结果将回流 DISCONNECT ; CONNECT 是我们首次揭示 Quack 时展示的 remote.query($$...$$) 替代方案的继任者 - 我们看了那个语法并说:不,这不能算是个方案。CONNECT 并不局限于 Quack:它使你的会话指向任何支持的远程数据库,而新的远程下推优化器 (#22914) 直接将 SQL 发送到 PostgreSQL 和 MySQL,而不是通过网络拉取表:CONNECT 'postgres://localhost/mydb' ; SELECT count ( * ) FROM orders ; -- 在 PostgreSQL 服务器上运行 DISCONNECT ; 如果您之前曾处理过分析系统,您可能会认为 DuckDB 不能处理事务性工作负载。但自第一天以来,DuckDB 就被构建为一个事务性、多连接的数据库,具备完整的 MVCC 和事务隔离。大多数用户在单用户场景下根本不需要这些。事实证明,DuckDB 对于事务的处理相当不错:在许多工作负载中,它的运行速度足够与 PostgreSQL 等通用数据库竞争,而客户端/服务器模式最终让这种机制在多租户和长时间运行的部署中发光发热。长期运行 DuckDB 也带来了新的挑战,这就是为什么 v2.0 着眼于更好的指标、日志和可观察性(例如,#22799 中的指标层重新设计),让您可以查看 DuckDB 实例并了解其实际操作。人们甚至在预览版发布几周内为 Quack 协议构建了独立客户端。我们以为我们在扩展 DuckDB 以与其他 DuckDB 进行通信;而世界却说不,不,不,并构建了自己的客户端。谁能料到呢。 2. VARIANT 成为第一类公民 VARIANT 类型在 DuckDB v1.5 中发布,想象一下它就是加了速的 JSON。基本上,想象一下,如果 JSON 更快。与 JSON 一样,VARIANT 列可以在每行中存储形状不同的数据。与 JSON 不同,它不是文本格式:DuckDB 自动检测隐藏在半结构化数据中的通用结构并“切割”它,因此在存储中压缩良好,并在查询中执行快速,所有这些都不需要您声明模式。这使得 VARIANT 自然而然地适合实时日志摄取,其中 JSON 类记录流共享结构但随时间演变。在 v2.0 中,这个管道实现端到端:存储直接碎片化执行(#20912),提取下推进入扫描(#22478),为 Parquet 读取和写入碎片化的 VARIANT,以及一系列变体_* 函数:CREATE TABLE events ( payload VARIANT ); INSERT INTO events VALUES ( '{

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡