DuckDB 2.0 LTS发布:支持服务器模式与Agent Mode

DuckDB 2.0 LTS版本正式发布。该版基于近两万次代码提交,新增服务器模式、异步I/O及Agent Mode等核心功能,支持期至少延续至2027年10月。

TL;DR:DuckDB 团队正式发布 DuckDB 2.0.0 LTS 版本,代号为“Cinnamon Teal”(Spatula cyanoptera)。该版本基于自 DuckDB 1.5 以来的近 20,000 次代码提交构建,引入了成熟的 Quack 协议、异步 I/O、一等公民的 VARIANT 类型、Agent Mode、触发器及可扩展 SQL 解析器等核心特性。

Agent Mode减少59%输出量

与侧重稳定性和向后兼容性的 DuckDB 1.0 不同,DuckDB 2.0 是一个以功能增强为主的版本。目前有三条 DuckDB 支持线路并行:DuckDB 2.0 作为长期支持 (LTS) 版本,维护期至少持续至 2027 年 10 月;前一代 LTS 版本 1.4 支持至 2026 年 11 月底;为确保平滑过渡,DuckDB 1.5 的支持期延长至 2027 年 3 月,实质上转化为 LTS 版本。

DuckDB 服务器化与 Quack 协议

DuckDB 长期以来定位为嵌入式数据库,但在 2.0 中,通过引入并优化 Quack 协议,实现了传统的客户端-服务器架构运行模式。任何 DuckDB 进程均可通过 quack 扩展提供数据库服务。

DuckDB 2.0.0 对 Quack 协议进行了性能与稳定性优化,并新增 CONNECT 语句,允许用户在单一命令中连接并切换至远程数据库:

-- 在 DuckDB 服务器上
CALL quack_serve(token = 'my_token');

CREATE TABLE events (date DATE, name VARCHAR);
INSERT INTO events VALUES ('2027-04-07', 'DuckCon #8');
-- 在 DuckDB 客户端
ATTACH 'quack:localhost' AS qk (TOKEN 'my_token');
CONNECT qk;
SELECT * FROM events;

默认情况下,Quack 服务器仅监听 localhost。若需接受外部连接,建议将服务器置于 TLS 终止反向代理之后。CONNECT 语句不仅限于 Quack 协议,也支持 PostgreSQL 和 MySQL 等远程数据库,新的远程推送优化器可将查询直接发送至远程服务器执行。

CLI 工具同步更新了快捷参数:-serve 用于启动 Quack 服务器,-connect 用于直接连接服务器。

性能改进

异步 I/O

DuckDB 2.0 为 Parquet 和 CSV 文件读取引入了异步 I/O 机制。I/O 层现独立于查询处理层进行扩展,能够在后台发出读取请求并保持多个请求并发。这一改动显著提升了远程读取的并行度,加速了针对对象存储(如 s3://)的查询速度。

VARIANT 类型成为一等公民

VARIANT 类型用于存储无模式的半结构化数据(如 JSON),同时保持列式执行的性能优势。虽然 DuckDB 1.5 已引入该类型,但 2.0 实现了完全集成,能够自动检测数据中的常见结构并进行“碎片化”处理,支持从存储到 Parquet 读写的全链路执行及 variant_* 函数家族。

CREATE TABLE events (payload VARIANT);
INSERT INTO events VALUES
    ('{"user": {"id": 42, "tags": ["a", "b"]}}'::JSON::VARIANT),
    ('{"event": "click", "x": 10, "y": 20}'::JSON::VARIANT);

SELECT variant_type(payload), variant_keys(payload) FROM events;

CLI Agent Mode

针对 Claude Code、Codex 和 Cursor 等编码代理频繁调用 DuckDB CLI 的场景,2.0 版 CLI 新增了 Agent Mode。当检测到被代理运行时,CLI 会自动切换输出格式:使用紧凑的 Markdown 表格替代填充框,明确标识截断结果,提前停止失控查询,并以 JSON 格式报告错误。长时间运行的 SQL 查询会在执行前报告预期成本,供代理决策。实验数据显示,Agent Mode 使 TPC-H 测试中的输出量减少了 59%。用户可通过 -agent 或 -no-agent 标记手动控制此模式。

可扩展性增强

全新 PEG SQL 解析器

DuckDB 弃用了源自 PostgreSQL 的传统解析器,转而采用基于 PEG(解析表达文法)的现代可扩展解析器。新解析器支持扩展连接到语法本身,并提供带有精确源位置的错误消息。旧解析器自 2018 年起使用 YACC/Bison 生成 LALR(1) 解析器,随着 SQL 方言演进,规则冲突风险增加。PEG 语法通过按顺序尝试替代词避免了此类冲突,类似于 Python 3.9 迁移至 PEG 解析器的做法。用户可通过 SET enable_legacy_parser = true 临时回退至旧解析器。

自定义扩展仓库托管

DuckDB 2.0 更新了 C API v2,增强了文件系统与表函数的扩展能力。同时,用户可注册并托管可信的扩展存储库,使组织能够发布和签名自己的扩展:

SET allow_extension_repositories = 'allowed';

CREATE EXTENSION REPOSITORY my_repo
    WITH PREFIX 'https://extensions.example.org';

INSTALL AND LOAD my_ext FROM my_repo;

该功能仍在开发中,语法可能在未来版本调整。

核心扩展更新

  • DuckLake 1.1:发布了新规范及参考实现。
  • Iceberg 扩展:旨在成为功能齐全的实现,新增 REST 目录 ATTACH 选项,支持从元数据位置文件导出表位置,并可控制 URL 前缀与命名空间分隔符。
  • Delta 扩展:支持使用 CREATE TABLE 创建 Delta 表(含分区与属性),支持时间旅行,并改进了 VARIANT 支持。

SQL 特性

触发器支持

DuckDB 2.0 引入 CREATE TRIGGER 语句,支持 BEFORE/AFTER、行级/语句级触发器,以及通过 REFERENCING OLD/NEW TABLE 访问转换表。典型用例包括审计表记录变化。部分组合场景(如 BEFORE UPDATE FOR EACH ROW)暂不支持。触发器也被用于逐步维护物化视图,例如通过插入和删除操作分别更新总和与计数。

CREATE TRIGGER trg_audit
    AFTER UPDATE ON target
    REFERENCING OLD TABLE AS o NEW TABLE AS n
    FOR EACH STATEMENT
        INSERT INTO audit
        SELECT n.id, o.val, n.val
        FROM o JOIN n ON o.id = n.id;

SQL 方言扩展

  • 支持 $variable 简写形式替代 getvariable('x')。
  • 数据修改 CTEs 允许将 INSERT、UPDATE、DELETE 和 COPY 作为管道步骤。
  • Top-k 相似性搜索转换为 Join 子句,便于向量与嵌入工作负载。
  • 支持嵌套方案(Schema in Schema),如 finance.reports。
  • 新增 JSON 突变函数:json_set, json_insert, json_replace, json_remove。
  • 支持 SQL 标准 FETCH FIRST,允许 GROUP BY 中使用 UNNEST,并确保 MERGE 和 UPDATE 在多行匹配时的语义精确性。

迁移与内部变更

DuckDB 2.0 包含少量突破性变化。最需要注意的是存储格式兼容性:2.0 之前的版本无法读取由 2.0 创建的数据库文件,但 2.0 仍可读写现有旧格式文件。建议在生产环境切换前于影子系统进行测试。对于任务关键型工作负载,官方建议等待 11 月份的首个补丁发布。

编译要求

DuckDB 2.0 不再依赖 C++11,现要求 C++17 编译器。Linux 和 macOS 上的 DuckDB 及其核心扩展默认使用 Clang 构建;Windows 上 CLI 使用 Clang,多数核心扩展仍使用 MSVC。

移除 ICU 依赖

时区感知的时间戳、日历和排序规则此前依赖 ICU 库。在 2.0 中,ICU 库被完全移除,相关功能由 icu 扩展原生实现,时区数据直接从 IANA 数据库构建并压缩至约 45 kB。原生实现速度更快且行为保持一致。

废弃项

  • Lambda 语法:旧的单箭头语法 (x -> x + 1) 默认禁用,推荐使用 Python 风格语法 (lambda x: x + 1)。旧语法将在 v2.1 中彻底移除。
  • Amalgamation Builds:由于体积过大,合并源代码构建方式已被弃用。
  • macOS x86_64 支持:正在逐步淘汰 osx_amd64 平台支持。目前 DuckDB 及核心扩展仍受支持,但社区扩展不再为该平台构建。DuckDB 2.1 将停止支持该平台。

评论 0

0/500

评论需审核后展示,请文明发言

💬
还没有评论,来说两句

相关阅读