<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>工程实践 on DuckDB Lab — 独立 DuckDB 中文技术社区与实验博客</title><link>https://duckdblab.org/zh/categories/%E5%B7%A5%E7%A8%8B%E5%AE%9E%E8%B7%B5/</link><description>Recent content in 工程实践 on DuckDB Lab — 独立 DuckDB 中文技术社区与实验博客</description><generator>Hugo -- gohugo.io</generator><language>zh-CN</language><lastBuildDate>Wed, 21 Oct 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://duckdblab.org/zh/categories/%E5%B7%A5%E7%A8%8B%E5%AE%9E%E8%B7%B5/index.xml" rel="self" type="application/rss+xml"/><item><title>DuckDB 2.0 深度解读：从嵌入式数据库到服务化数据库的质变</title><link>https://duckdblab.org/zh/post/duckdb-2-0-deep-dive/</link><pubDate>Wed, 21 Oct 2026 00:00:00 +0000</pubDate><guid>https://duckdblab.org/zh/post/duckdb-2-0-deep-dive/</guid><description>&lt;img src="https://duckdblab.org/images/posts/duckdb-2-0-deep-dive/architecture.png" alt="Featured image of post DuckDB 2.0 深度解读：从嵌入式数据库到服务化数据库的质变" /&gt;&lt;h2 id="为什么-20-不是又一次功能堆叠"&gt;为什么 2.0 不是又一次功能堆叠
&lt;/h2&gt;&lt;p&gt;DuckDB 1.0 的关键词是&lt;strong&gt;稳定与向后兼容&lt;/strong&gt;，1.5 把 Quack 协议、VARIANT、Agent 可观测性铺了底。而 2.0 LTS（代号 &amp;ldquo;Cinnamon Teal&amp;rdquo;，取自美洲西部的彩头鸭 &lt;em&gt;Spatula cyanoptera&lt;/em&gt;）自 1.5 以来累计近 2 万个 commit，官方把它定位成&lt;strong&gt;功能发布&lt;/strong&gt;，不是修补。&lt;/p&gt;
&lt;p&gt;判断一篇版本解读有没有&amp;quot;深度&amp;quot;，标准不该是&amp;quot;列了多少新特性&amp;quot;，而是能不能说清&lt;strong&gt;每个特性改变了数据库的哪一层边界&lt;/strong&gt;。2.0 真正质变的点，是把 DuckDB 从一个&lt;strong&gt;进程内嵌的分析引擎&lt;/strong&gt;，推成了一个&lt;strong&gt;可以同时以嵌入、服务、远程三种形态运行的数据库&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;服务化&lt;/strong&gt;：Quack 协议 + &lt;code&gt;CONNECT&lt;/code&gt;，任意 DuckDB 进程可把库服务出去，还能连 PostgreSQL/MySQL 并做远程下推&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;异步 I/O&lt;/strong&gt;：读层与查询层解耦，对象存储（&lt;code&gt;s3://&lt;/code&gt;）上的查询吞吐显著提升&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;VARIANT 成头等公民&lt;/strong&gt;：半结构化数据&amp;quot;shredding&amp;quot;后列式执行，JSON 性能直追原生列&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可插拔解析器&lt;/strong&gt;：内置 PEG 解析器，扩展能自定义 SQL 语法&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;触发器&lt;/strong&gt;：&lt;code&gt;CREATE TRIGGER&lt;/code&gt; 补齐审计表与物化视图增量维护的最后一块&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agent 模式&lt;/strong&gt;：CLI 检测到被 AI 编程代理驱动时自动切紧凑输出，TPC-H 实测减少 59% 输出&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;下面逐层拆解，代码均用 &lt;strong&gt;DuckDB 2.0.0 CLI 实测&lt;/strong&gt;（非 1.5）。&lt;/p&gt;
&lt;p&gt;&lt;img alt="DuckDB 2.0.0 架构与核心能力" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://duckdblab.org/images/posts/duckdb-2-0-deep-dive/architecture.png"&gt;&lt;/p&gt;
&lt;h2 id="1-服务化quack-协议与-connect"&gt;1. 服务化：Quack 协议与 CONNECT
&lt;/h2&gt;&lt;p&gt;DuckDB 从第一天起就是进程内嵌数据库。1.5.3 引入 Quack 协议后，2.0 把它做成了&lt;strong&gt;打磨过的一等能力&lt;/strong&gt;——任何 DuckDB 进程都能用 &lt;code&gt;quack_serve&lt;/code&gt; 把库服务出去，别的进程用 &lt;code&gt;ATTACH ... 'quack:localhost'&lt;/code&gt; 连上。&lt;/p&gt;
&lt;p&gt;服务端（起服务 + 写入）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;CALL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;quack_serve&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;my_token&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;TABLE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;DATE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;INSERT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;INTO&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;VALUES&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;2027-04-07&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;DuckCon #8&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;客户端（连接 + 切换 + 查询）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ATTACH&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;quack:localhost&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;qk&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TOKEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;my_token&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;CONNECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;qk&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;date&lt;/th&gt;
 &lt;th&gt;name&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;2027-04-07&lt;/td&gt;
 &lt;td&gt;DuckCon #8&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;

 &lt;blockquote&gt;
 &lt;p&gt;安全注意：默认只监听 localhost。跨机器访问应保持服务端在 localhost、前置 TLS 终结反向代理；&lt;code&gt;allow_other_hostname&lt;/code&gt; 仅供测试。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;&lt;code&gt;CONNECT&lt;/code&gt; 的价值不止于 Quack——它能指向&lt;strong&gt;任何支持该协议的远程库，包括 PostgreSQL 和 MySQL&lt;/strong&gt;。对这些目标，2.0 的&lt;strong&gt;远程下推优化器&lt;/strong&gt;会把查询直接推到远端执行，而不是把整张表拉过网络回来再算。这一步把 DuckDB 从&amp;quot;本地分析引擎&amp;quot;扩展成&amp;quot;能跨数据源做联邦查询&amp;quot;的角色，是 SaaS 多租户、混合数据场景的关键一环（延伸阅读：&lt;a class="link" href="https://duckdblab.org/zh/post/duckdb-v2-server-mode-guide/" &gt;DuckDB v2.0 Server Mode 架构&lt;/a&gt;）。&lt;/p&gt;
&lt;p&gt;CLI 里还有快捷入口：&lt;code&gt;duckdb -serve&lt;/code&gt; 起服务、&lt;code&gt;duckdb -connect&lt;/code&gt; 直连，省得手写 &lt;code&gt;quack_serve&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id="2-性能异步-io"&gt;2. 性能：异步 I/O
&lt;/h2&gt;&lt;p&gt;2.0 给 Parquet、CSV 以及 DuckDB 原生存储格式引入&lt;strong&gt;异步 I/O&lt;/strong&gt;：I/O 层不再与查询处理层绑定，读操作在后台发起、多个请求并行在途。对本地盘是&amp;quot;锦上添花&amp;quot;，对 &lt;code&gt;s3://&lt;/code&gt; 这类高延迟对象存储则是&lt;strong&gt;数量级改善&lt;/strong&gt;——网络吞吐利用率更高、查询运行时间更短。&lt;/p&gt;
&lt;p&gt;设计细节官方单独发了一篇博客讲清（含启用前后吞吐对比曲线），这里不展开。记住一句：&lt;strong&gt;读远端大文件时，2.0 的异步 I/O 是你白拿的性能红利。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="3-variant-成为头等公民"&gt;3. VARIANT 成为头等公民
&lt;/h2&gt;&lt;p&gt;VARIANT 在 1.5 已引入，但 2.0 把它&lt;strong&gt;完整集成&lt;/strong&gt;了：存的是 schema-less 半结构化数据（典型如 JSON），却保留列式执行的性能——可理解为&amp;quot;加强版 JSON&amp;quot;。每一行可以是不同形状的数据，但它不是文本格式。&lt;/p&gt;
&lt;p&gt;核心机制是 &lt;strong&gt;shredding（解构）&lt;/strong&gt;：2.0 检测数据中的公共结构，把它&amp;quot;打散&amp;quot;成列式存储，于是既能高压缩、又能快速执行。流水线端到端打通——从解构后的存储执行，到 Parquet 的 VARIANT 读写，再到一族 &lt;code&gt;variant_*&lt;/code&gt; 函数：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;TABLE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;VARIANT&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;INSERT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;INTO&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;VALUES&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;{&amp;#34;user&amp;#34;: {&amp;#34;id&amp;#34;: 42, &amp;#34;tags&amp;#34;: [&amp;#34;a&amp;#34;,&amp;#34;b&amp;#34;]}}&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;VARIANT&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;{&amp;#34;event&amp;#34;:&amp;#34;click&amp;#34;,&amp;#34;x&amp;#34;:10,&amp;#34;y&amp;#34;:20}&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;VARIANT&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;variant_type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;variant_keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;t&lt;/th&gt;
 &lt;th&gt;k&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;OBJECT&lt;/td&gt;
 &lt;td&gt;[user]&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;OBJECT&lt;/td&gt;
 &lt;td&gt;[event, x, y]&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;对做事件流、埋点、半结构化日志分析的人，这一条意味着：&lt;strong&gt;不用再为 JSON 的灵活性牺牲列式性能&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id="4-agent-模式为-ai-编程代理而设计"&gt;4. Agent 模式：为 AI 编程代理而设计
&lt;/h2&gt;&lt;p&gt;这是 2.0 里最&amp;quot;时代&amp;quot;的功能。当 CLI 检测到被 Claude Code、Codex、Cursor 这类编程代理驱动时，自动切到 &lt;strong&gt;Agent 模式&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;输出紧凑 Markdown 表（而非填充格子的盒子）&lt;/li&gt;
&lt;li&gt;明确标注结果是否被截断&lt;/li&gt;
&lt;li&gt;提前中止失控查询&lt;/li&gt;
&lt;li&gt;报错用 JSON&lt;/li&gt;
&lt;li&gt;长查询先报告预估成本，让代理决定是否等&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;官方在 TPC-H 上实测：&lt;strong&gt;Agent 模式让模型要读的 DuckDB 输出减少 59%&lt;/strong&gt;。手动测试可用 &lt;code&gt;-agent&lt;/code&gt;，让代理关闭用 &lt;code&gt;-no-agent&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;duckdb -agent :memory: &lt;span class="s2"&gt;&amp;#34;SELECT 42 AS x;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;实测输出是紧凑形式：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;| x:INTEGER |
|---|
| 42 |
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这与 DuckDB 做 AI 数据接口的方向一脉相承（延伸阅读：&lt;a class="link" href="https://duckdblab.org/zh/post/duckdb-ai-agent-brain/" &gt;用 DuckDB 构建 AI Agent 大脑&lt;/a&gt;、&lt;a class="link" href="https://duckdblab.org/zh/post/duckdb-mcp-server-guide/" &gt;DuckDB MCP Server 指南&lt;/a&gt;）。&lt;/p&gt;
&lt;h2 id="5-可扩展性全新-peg-解析器"&gt;5. 可扩展性：全新 PEG 解析器
&lt;/h2&gt;&lt;p&gt;DuckDB 历来用&lt;strong&gt;从 PostgreSQL 派生的解析器&lt;/strong&gt;。2.0 起，自家的现代 &lt;strong&gt;PEG 解析器&lt;/strong&gt;（1.5 里作为 opt-in 试用）成为&lt;strong&gt;默认&lt;/strong&gt;。扩展现在能&lt;strong&gt;钩进语法本身&lt;/strong&gt;——官方预期会有暴露全新 SQL 语法的扩展出现。报错也带上了精确的源码位置。&lt;/p&gt;
&lt;p&gt;为什么换？老解析器基于 YACC/Bison 生成的 LALR(1) 语法，随着 DuckSQL 扩张，任何小改动都可能撞上既有规则、引发 shift/reduce 或 reduce/reduce 冲突。PEG 按书写顺序尝试各分支，&lt;strong&gt;新增语法不再有不破坏无关规则的风险&lt;/strong&gt;（Python 3.9 也是为此转向 PEG）。新解析器与旧的保持兼容，出可用 &lt;code&gt;SET enable_legacy_parser = true;&lt;/code&gt; 切回（2.0 实测该开关存在且生效）。&lt;/p&gt;
&lt;h3 id="自己写扩展自己托管"&gt;自己写扩展、自己托管
&lt;/h3&gt;&lt;p&gt;C API v2 大幅增强，暴露了文件系统、表函数等组件给扩展。还能注册并托管&lt;strong&gt;可信扩展仓库&lt;/strong&gt;——一个组织可签发自己的扩展并像内置一样安装加载：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;SET&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;allow_extension_repositories&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;allowed&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;EXTENSION&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;REPOSITORY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;my_repo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;WITH&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;PREFIX&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;https://extensions.example.org&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;INSTALL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AND&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;LOAD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;my_ext&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;my_repo&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;CREATE&lt;/code&gt; 时会拉取仓库的公钥并固化进仓库定义，打印每个 key 的 SHA-256 指纹供带外比对。该特性仍在演进，语法可能变。&lt;/p&gt;
&lt;h2 id="6-核心扩展更新"&gt;6. 核心扩展更新
&lt;/h2&gt;&lt;p&gt;2.0 同时带了一批核心扩展的更新与性能优化，挑几个生产相关的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DuckLake 1.1&lt;/strong&gt;：新规格 + 参考实现&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Iceberg&lt;/strong&gt;：向&amp;quot;功能完整&amp;quot;推进，新增 REST catalog 的 ATTACH 选项（按 namespace 推导表位置，或从 catalog 返回的 metadata-location 文件读元数据）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Delta&lt;/strong&gt;：支持 &lt;code&gt;CREATE TABLE&lt;/code&gt;（含分区与 Delta 表属性）、时间旅行、改进 VARIANT 支持&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="7-触发器审计表与物化视图增量维护"&gt;7. 触发器：审计表与物化视图增量维护
&lt;/h2&gt;&lt;p&gt;2.0 交付了 &lt;code&gt;CREATE TRIGGER&lt;/code&gt;，支持 BEFORE/AFTER、FOR EACH ROW / FOR EACH STATEMENT、经 &lt;code&gt;REFERENCING OLD/NEW TABLE&lt;/code&gt; 的过渡表、单事件多触发器、被触发表上的 RETURNING、DROP TRIGGER。经典用例是&lt;strong&gt;审计表&lt;/strong&gt;——记录一次表修改时发生了什么：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;TRIGGER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;trg_audit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AFTER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;UPDATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;ON&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;REFERENCING&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;OLD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;TABLE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;NEW&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;TABLE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FOR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;EACH&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;STATEMENT&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;INSERT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;INTO&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;audit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;JOIN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;ON&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;更妙的是，触发器能&lt;strong&gt;增量维护物化视图&lt;/strong&gt;。下面用两个触发器（一个 INSERT、一个 DELETE）维护&amp;quot;按国籍统计平均年龄&amp;quot;的聚合表：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;TABLE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;people&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;nationality&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;INTEGER&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;TABLE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;age_statistics&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nationality&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;PRIMARY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sum_age&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;INTEGER&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;num_people&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;INTEGER&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;average_age&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;DOUBLE&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;TRIGGER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;people_insert&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AFTER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;INSERT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;ON&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;people&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;REFERENCING&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;NEW&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;TABLE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FOR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;EACH&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;STATEMENT&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;MERGE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;INTO&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;age_statistics&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;USING&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;nationality&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sum_age&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;num_people&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;GROUP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;BY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;nationality&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;ON&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nationality&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nationality&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;WHEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MATCHED&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;THEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;UPDATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;SET&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sum_age&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sum_age&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sum_age&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;num_people&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;num_people&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;num_people&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;average_age&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sum_age&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sum_age&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;num_people&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;num_people&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;WHEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;NOT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MATCHED&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;THEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;INSERT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;VALUES&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nationality&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sum_age&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;num_people&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sum_age&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;num_people&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;实测：插入 6 人后聚合表自动生成：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;nationality&lt;/th&gt;
 &lt;th&gt;sum_age&lt;/th&gt;
 &lt;th&gt;num_people&lt;/th&gt;
 &lt;th&gt;average_age&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;HU&lt;/td&gt;
 &lt;td&gt;45&lt;/td&gt;
 &lt;td&gt;1&lt;/td&gt;
 &lt;td&gt;45.0&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;NL&lt;/td&gt;
 &lt;td&gt;87&lt;/td&gt;
 &lt;td&gt;3&lt;/td&gt;
 &lt;td&gt;29.0&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;US&lt;/td&gt;
 &lt;td&gt;92&lt;/td&gt;
 &lt;td&gt;2&lt;/td&gt;
 &lt;td&gt;46.0&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;官方反复强调：触发器让 DuckDB &lt;strong&gt;离&amp;quot;物化视图&amp;quot;这个长期路线图又近了一步&lt;/strong&gt;（BEFORE &amp;hellip; FOR EACH ROW 等少数组合暂不支持，见官方限制说明）。&lt;/p&gt;
&lt;h2 id="8-sql-方言扩充"&gt;8. SQL 方言扩充
&lt;/h2&gt;&lt;p&gt;2.0 的方言新增，挑实用项：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;$&lt;/code&gt; 变量简写&lt;/strong&gt;：大多数表达式位置可写 &lt;code&gt;$x&lt;/code&gt; 替代 &lt;code&gt;getvariable('x')&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据修改 CTE&lt;/strong&gt;：&lt;code&gt;INSERT&lt;/code&gt;/&lt;code&gt;UPDATE&lt;/code&gt;/&lt;code&gt;DELETE&lt;/code&gt;/&lt;code&gt;COPY&lt;/code&gt; 可作为管道步骤&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NEAREST join&lt;/strong&gt;：把 top-k 相似检索变成 join 子句，向量/嵌入场景直接受益&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;嵌套 schema&lt;/strong&gt;：&lt;code&gt;CREATE SCHEMA finance.reports;&lt;/code&gt; 支持 schema 里套 schema&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JSON 变更函数&lt;/strong&gt;：&lt;code&gt;json_set&lt;/code&gt; / &lt;code&gt;json_insert&lt;/code&gt; / &lt;code&gt;json_replace&lt;/code&gt; / &lt;code&gt;json_remove&lt;/code&gt; 返回修改后的 JSON 副本（详见 &lt;a class="link" href="https://duckdblab.org/zh/post/duckdb-json-patch-functions/" &gt;JSON 补丁函数实战&lt;/a&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;实测嵌套 schema 与 JSON 变更（2.0 CLI）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;SCHEMA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;finance&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;SCHEMA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;finance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reports&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;SHOW&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;SCHEMAS&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- memory | finance / main / reports 三行
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;json_set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;{&amp;#34;a&amp;#34;:1,&amp;#34;b&amp;#34;:2}&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;$.c&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;3&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;json_remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;{&amp;#34;a&amp;#34;:1,&amp;#34;b&amp;#34;:2}&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;$.b&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- {&amp;#34;a&amp;#34;:1,&amp;#34;b&amp;#34;:2,&amp;#34;c&amp;#34;:3} {&amp;#34;a&amp;#34;:1}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;另：2.0 支持 SQL 标准的 &lt;code&gt;FETCH FIRST&lt;/code&gt;，并允许 &lt;code&gt;UNNEST&lt;/code&gt; 出现在 &lt;code&gt;GROUP BY&lt;/code&gt; 子句里；对多行命中时，&lt;code&gt;MERGE&lt;/code&gt; 与 &lt;code&gt;UPDATE ... FROM&lt;/code&gt; 的语义被定义得无歧义。&lt;/p&gt;
&lt;h2 id="9-迁移到-20破坏性变更与注意项"&gt;9. 迁移到 2.0：破坏性变更与注意项
&lt;/h2&gt;&lt;p&gt;升级对多数用户平滑，但&lt;strong&gt;多进程、生产级部署&lt;/strong&gt;要看清这三处：&lt;/p&gt;
&lt;h3 id="存储格式最易踩坑"&gt;存储格式（最易踩坑）
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;2.0 之前的版本无法读取 2.0 创建的数据库文件&lt;/strong&gt;；而 2.0 仍能读写旧文件、且旧文件对老版本保持可读。建议先在影子系统上验证再切生产；关键工作负载可等 11 月的首个补丁版本。&lt;/p&gt;
&lt;h3 id="编译器要求"&gt;编译器要求
&lt;/h3&gt;&lt;p&gt;告别 C++11，2.0 起&lt;strong&gt;要求 C++17 编译器&lt;/strong&gt;；Linux/macOS 发行构建默认改用 Clang（Windows 的 CLI 用 Clang，多数核心扩展仍是 MSVC）。&lt;/p&gt;
&lt;h3 id="时区日历排序去掉-icu-依赖"&gt;时区/日历/排序：去掉 ICU 依赖
&lt;/h3&gt;&lt;p&gt;2.0 &lt;strong&gt;彻底移除 ICU 库&lt;/strong&gt;——&lt;code&gt;icu&lt;/code&gt; 扩展现在自实现时区、日历、排序，时区数据直接由 IANA 数据库构建并压缩到约 45 kB，行为不变且更快。&lt;/p&gt;
&lt;h3 id="弃用项"&gt;弃用项
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Lambda 旧单箭头语法&lt;/strong&gt;（&lt;code&gt;x -&amp;gt; x + 1&lt;/code&gt;）默认禁用，改用 Python 风格：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;list_transform&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;lambda&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;-- [2, 3, 4]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- 旧语法 2.0 实测报：
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- Binder Error: Deprecated lambda arrow (-&amp;gt;) detected ...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- 可临时 SET lambda_syntax=&amp;#39;ENABLE_SINGLE_ARROW&amp;#39; 切回，v2.1 彻底移除
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;amalgamation 构建&lt;/strong&gt;（把整库源码压成单 header + 单 .c）弃用——已大到多数场景不再实用&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;macOS x86_64&lt;/strong&gt; 逐步退场：当前仍构建支持，但社区扩展不再为其构建，v2.1 起停止支持&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="三条-lts-线"&gt;三条 LTS 线
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;版本&lt;/th&gt;
 &lt;th&gt;支持到&lt;/th&gt;
 &lt;th&gt;说明&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;1.4&lt;/td&gt;
 &lt;td&gt;2026 年 11 月底&lt;/td&gt;
 &lt;td&gt;旧 LTS&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;1.5&lt;/td&gt;
 &lt;td&gt;2027 年 3 月&lt;/td&gt;
 &lt;td&gt;官方延长，事实上的 LTS&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;2.0&lt;/td&gt;
 &lt;td&gt;2027 年 10 月&lt;/td&gt;
 &lt;td&gt;新 LTS，Cinnamon Teal&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="小结与下一步"&gt;小结与下一步
&lt;/h2&gt;&lt;p&gt;2.0 的核心不是&amp;quot;多了 X 个函数&amp;quot;，而是&lt;strong&gt;数据库形态的扩展&lt;/strong&gt;：嵌入、服务、远程三种运行方式共存；VARIANT + 触发器 + 异步 I/O 让&amp;quot;分析库&amp;quot;真正能干&amp;quot;事务库&amp;quot;的活；PEG 解析器 + C API v2 把可定制性打开给扩展作者。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;想在 2.0 上落地服务化：&lt;a class="link" href="https://duckdblab.org/zh/post/duckdb-v2-server-mode-guide/" &gt;Server Mode 架构&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;想接 AI 工作流：&lt;a class="link" href="https://duckdblab.org/zh/post/duckdb-ai-agent-brain/" &gt;AI Agent 大脑&lt;/a&gt;、&lt;a class="link" href="https://duckdblab.org/zh/post/duckdb-mcp-server-guide/" &gt;MCP Server 指南&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;装与跑通：&lt;a class="link" href="https://duckdblab.org/zh/post/duckdb-install-guide/" &gt;安装指南&lt;/a&gt;、&lt;a class="link" href="https://duckdblab.org/zh/post/duckdb-complete-guide/" &gt;完全指南&lt;/a&gt;、&lt;a class="link" href="https://duckdblab.org/zh/cheatsheet/" &gt;速查表&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>