引言
2026 年 4 月 13 日,DuckDB 团队正式发布了 v1.5.2 版本,这是 v1.5 系列的第二个补丁版本(继 3 月的 v1.5.0 和 v1.5.1 之后)。虽然名为"补丁版本",但 1.5.2 带来的更新绝不"微小"——从 DuckLake v1.0 的生产就绪声明,到与 Jepsen 的正式合作,再到在线 Shell 的全面重写,每一项都值得深入探讨。
本文将逐一拆解这些更新,用代码示例带你体验新功能,并通过性能对比和数据帮助你理解这些变化对日常数据分析工作的实际影响。
一、DuckLake v1.0:基于 SQL 的湖仓格式走向生产
1.1 什么是 DuckLake?
DuckLake 是 DuckDB 团队推出的湖仓格式规范及其参考实现。在 v1.5.2 中,DuckLake 正式达到 v1.0,标记为生产就绪(production-ready)。这意味着:
- 向后兼容保证:未来版本不会破坏现有 DuckLake 数据
- 数十个 Bug 修复:从 v0.x 到 v1.0 积累了大量的稳定性改进
- 多项新功能:数据内联(Data Inlining)、排序表(Sorted Tables)、桶分区(Bucket Partitioning)、删除缓冲区(Deletion Buffers)
1.2 数据内联(Data Inlining)
数据内联是 DuckLake v1.0 最引人注目的新特性之一。它允许小文件直接嵌入到清单(Manifest)中,从而避免大量小文件的 I/O 开销,特别适合流式写入场景。
-- 安装并加载 DuckLake 扩展
INSTALL ducklake;
LOAD ducklake;
-- 创建 DuckLake 表并启用数据内联
CREATE OR REPLACE TABLE sensor_readings (
ts TIMESTAMP,
sensor_id INTEGER,
temperature DOUBLE,
humidity DOUBLE
) USING ducklake
LOCATION 's3://my-bucket/sensor-data/'
WITH (
data_inlining = true,
inline_size_limit = '1MB'
);
-- 写入数据(小批量写入将被内联到清单中)
INSERT INTO sensor_readings VALUES
('2026-05-15 10:00:00', 1, 22.5, 65.0),
('2026-05-15 10:00:01', 2, 23.1, 63.5),
('2026-05-15 10:00:02', 3, 21.8, 67.2);
-- 读取数据
SELECT sensor_id, avg(temperature) AS avg_temp
FROM sensor_readings
WHERE ts >= '2026-05-15 00:00:00'
GROUP BY sensor_id
ORDER BY sensor_id;
1.3 排序表与桶分区
排序表(Sorted Tables)允许在写入时按指定列排序,大幅提升后续范围查询的性能。桶分区(Bucket Partitioning)则将数据按哈希值分布到固定数量的桶中,避免数据倾斜。
-- 创建排序表 + 桶分区
CREATE TABLE orders (
order_id BIGINT,
customer_id INTEGER,
order_date DATE,
amount DECIMAL(10,2)
) USING ducklake
LOCATION 's3://my-bucket/orders/'
WITH (
sort_by = 'order_date',
bucket_partitions = 16,
bucket_column = 'customer_id'
);
-- 写入 100 万条示例数据
INSERT INTO orders
SELECT
range AS order_id,
(range % 10000)::INTEGER AS customer_id,
'2026-01-01'::DATE + (range % 365) AS order_date,
(random() * 1000)::DECIMAL(10,2) AS amount
FROM range(1, 1000000);
-- 范围查询将受益于排序
SELECT customer_id, sum(amount) AS total_spent
FROM orders
WHERE order_date BETWEEN '2026-06-01' AND '2026-06-30'
GROUP BY customer_id
ORDER BY total_spent DESC
LIMIT 10;
1.4 与传统数据湖方案的对比
| 特性 | DuckLake v1.0 | Apache Iceberg | Delta Lake | Apache Hudi |
|---|---|---|---|---|
| 数据内联 | ✅ 原生支持 | ❌ 不支持 | ❌ 不支持 | ❌ 不支持 |
| 排序表 | ✅ 内置 | ⚠️ 需手动优化 | ⚠️ Z-order | ⚠️ 需配置 |
| 桶分区 | ✅ 原生 | ✅ 支持 | ⚠️ 有限 | ✅ 支持 |
| 删除缓冲区 (Puffin) | ✅ 兼容 Iceberg | ✅ 支持 | ❌ 不支持 | ❌ 不支持 |
| SQL 原生 | ✅ DuckDB 原生 | ⚠️ 需扩展 | ⚠️ 需扩展 | ⚠️ 需扩展 |
| 生产就绪 | ✅ v1.0 | ✅ 成熟 | ✅ 成熟 | ✅ 成熟 |
| 设置复杂度 | 低(一行 LOCATION) | 中 | 中 | 高 |
二、Iceberg 扩展的重大更新
DuckDB 的 Iceberg 扩展在 1.5.2 中获得了多项重要增强,使其成为查询 Iceberg 表的最佳工具之一。
2.1 GEOMETRY 类型支持
现在可以直接在 Iceberg 表中存储和查询空间数据:
INSTALL iceberg;
LOAD iceberg;
INSTALL spatial;
LOAD spatial;
-- 查询包含 GEOMETRY 列的 Iceberg 表
SELECT
st_area(geometry) AS area,
count(*) AS num_parcels
FROM 's3://my-bucket/land-parcels.iceberg'
WHERE st_within(
geometry,
st_geomfromtext('POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))')
)
GROUP BY st_area(geometry)
ORDER BY area DESC
LIMIT 5;
2.2 ALTER TABLE 和分区表操作
过去 DuckDB 对 Iceberg 表的写入能力有限。1.5.2 大幅扩展了这一能力:
-- 创建 Iceberg 分区表
CREATE TABLE metrics_iceberg AS
SELECT * FROM read_parquet('metrics.parquet');
-- 将数据写入 Iceberg 格式(分区表)
COPY (
SELECT * FROM metrics_iceberg
) TO 's3://my-bucket/metrics.iceberg'
(FORMAT ICEBERG, PARTITION_BY (event_date));
-- 更新和删除操作现在支持分区表
UPDATE 's3://my-bucket/metrics.iceberg'
SET status = 'archived'
WHERE event_date < '2025-01-01';
DELETE FROM 's3://my-bucket/metrics.iceberg'
WHERE event_date < '2024-01-01';
2.3 Truncate 和 Bucket 分区
Iceberg v3 规范中的 truncate 和 bucket 分区现在也得到完全支持:
-- 使用 truncate 分区(按字符串前缀)
CREATE TABLE user_events_iceberg
AS SELECT * FROM read_parquet('events.parquet');
COPY user_events_iceberg
TO 's3://my-bucket/events.iceberg'
(FORMAT ICEBERG,
PARTITION_BY (truncate(2, country_code)));
-- 使用 bucket 分区(按哈希)
COPY user_events_iceberg
TO 's3://my-bucket/events-bucketed.iceberg'
(FORMAT ICEBERG,
PARTITION_BY (bucket(16, user_id)));
三、Jepsen 正式合作:让 DuckDB 更加健壮
3.1 背景
DuckDB 团队与著名的分布式系统验证机构 Jepsen(由 Kyle Kingsbury 创立)展开合作,对 DuckDB 进行系统化的正确性验证。初步测试套件已发布在 duckdb-jepsen 仓库中。
3.2 已发现的 Bug 与修复
Jepsen 测试已经发现了一个涉及主键冲突解决的 Bug:
-- 复现被 Jepsen 发现的 Bug(已在 1.5.2 中修复)
CREATE TABLE users (
id INTEGER PRIMARY KEY,
name VARCHAR,
email VARCHAR
);
-- 插入初始数据
INSERT INTO users VALUES (1, 'Alice', 'alice@example.com');
-- 带冲突解决的 INSERT(曾触发错误)
INSERT INTO users VALUES (1, 'Alice Updated', 'alice.new@example.com')
ON CONFLICT (id) DO UPDATE
SET name = EXCLUDED.name,
email = EXCLUDED.email;
-- 1.5.2 中正常工作
SELECT * FROM users;
-- ┌─────┬───────────────┬────────────────────────┐
-- │ id │ name │ email │
-- ├─────┼───────────────┼────────────────────────┤
-- │ 1 │ Alice Updated │ alice.new@example.com │
-- └─────┴───────────────┴────────────────────────┘
这个 Bug 的修复位于 PR #21489。
3.3 对用户的意义
虽然 DuckDB 是单进程的嵌入式数据库(而非分布式系统),Jepsen 的验证仍然非常有价值——它确保了 DuckDB 在复杂并发场景和边界条件下的数据一致性。对于正在将 DuckDB 用于金融数据分析、日志审计、电商订单处理等需要严格数据一致性的场景的团队来说,这无疑是一剂强心针。
四、全新在线 Shell:浏览器变身数据工作台
4.1 全面重写
shell.duckdb.org 的在线 WebAssembly Shell 经过了完全重写。最引人注目的新功能是 文件存储系统。
4.2 文件存储功能
-- 列出当前会话中的文件
.files
-- 从 URL 导入文件到浏览器
.files import https://datasets.duckdb.org/weather.parquet
-- 创建新文件
COPY (
SELECT 'Hello, DuckDB!' AS greeting
) TO '/my-notes.txt';
-- 下载结果文件
.files download my-query-results.csv
4.3 内置数据集
新的 Shell 包含了几个内置数据集,方便快速实验:
-- 查询内置数据集
SELECT table_name, count(*) AS row_count
FROM information_schema.tables
WHERE table_schema = 'main'
GROUP BY table_name;
4.4 与传统在线 SQL 工具对比
| 特性 | DuckDB 新 Shell | SQLite Online | db-fiddle | SQL Fiddle |
|---|---|---|---|---|
| 文件拖拽上传 | ✅ | ❌ | ❌ | ❌ |
| 文件下载 | ✅ | ❌ | ❌ | ❌ |
| WebAssembly 本地运行 | ✅ | ❌ | ❌ | ❌ |
| 内置数据集 | ✅ | ❌ | ✅ | ✅ |
| COPY TO 语句 | ✅ | ⚠️ 有限 | ❌ | ❌ |
| 无需服务器 | ✅ | ❌ | ✅ | ✅ |
| 离线可用 | ⚠️ 需首次加载 | ❌ | ❌ | ❌ |
五、性能基准测试:Linux v7 内核带来 10% 提升
5.1 测试环境
DuckDB 团队在 AWS r8gd.8xlarge 实例(32 vCPU、256 GiB RAM、NVMe SSD)上运行了 TPC-H 基准测试,对比了 Ubuntu 24.04 LTS 和 Ubuntu 26.04 beta(搭载 Linux v7 内核)的性能。
5.2 测试结果
| 指标 | Ubuntu 24.04 (Linux v6) | Ubuntu 26.04 beta (Linux v7) | 提升幅度 |
|---|---|---|---|
| TPC-H QphH@Score | 778,041 | 854,676 | +9.85% |
| SF300 总查询时间 | 基线 | ~10% 更快 | ~10% |
这意味着仅通过升级操作系统内核,DuckDB 的查询性能就能获得近 10% 的免费提升。对于运行 DuckDB 的云服务器来说,这是一个极其划算的优化。
5.3 实际测试
-- 安装 TPC-H 扩展
INSTALL tpch;
LOAD tpch;
-- 生成 SF10 测试数据
CALL dbgen(sf = 10);
-- 运行查询 6(报告型聚合查询)
EXPLAIN ANALYZE
SELECT
sum(extendedprice * discount) AS revenue
FROM
lineitem
WHERE
shipdate >= '1994-01-01'
AND shipdate < date '1994-01-01' + interval '1' year
AND discount BETWEEN 0.06 - 0.01 AND 0.06 + 0.01
AND quantity < 24;
六、其他值得关注的变化
6.1 即将到来的活动
DuckDB 社区在 2026 年第二季度异常活跃:
- DuckCon #7(6 月 24 日,阿姆斯特丹):第七届用户大会,将在皇家热带研究所举办
- AI Council 2026(5 月 12 日):联合创始人 Hannes Mühleisen 将披露"DuckDB 的下一个大事件"
- Ubuntu Summit(5 月底):DuckDB Labs 的 Gábor Szárnyas 将发表演讲
七、与传统 ETL 工具的对比
| 维度 | DuckDB 1.5.2 + DuckLake | 传统 Spark + Hive | Snowflake | ClickHouse |
|---|---|---|---|---|
| 部署复杂度 | 单文件、零依赖 | Hadoop 集群 | 托管服务 | 自建集群 |
| 数据湖格式 | DuckLake / Iceberg / Delta / Lance | Hive / Iceberg | 自有格式 | 自有格式 |
| 查询性能 (ClickBench) | 冷启动中位数 0.57s | 数秒级别 | 亚秒级 | 亚秒级 |
| 内存需求 | 最低 8 GB | 64 GB+ | N/A(托管) | 16 GB+ |
| 设置学习成本 | 低(类 SQLite) | 极高 | 中 | 中 |
| 扩展开发 | C++/C/C#/Rust/Python | Java/Scala | SQL/JavaScript | C++ |
| 本地试错成本 | 免费,本地运行 | 需要集群 | 按量付费 | 需要部署 |
八、变现建议
DuckDB 1.5.2 带来的诸多新特性为技术变现提供了多条路径:
8.1 DuckLake 数据湖咨询
随着 DuckLake v1.0 达到生产就绪,越来越多的企业会考虑从传统 Hadoop/Spark 数据湖迁移。你可以提供:
- DuckLake 迁移服务:帮助企业将现有 Hive/Iceberg 表迁移到 DuckLake 格式,利用数据内联和排序表优化查询性能
- 性能审计:使用 DuckDB 的 EXPLAIN ANALYZE 和 TPC-H 基准测试为企业评估数据湖性能
- 定价参考:单次审计 $500-$2000,完整迁移项目 $5000-$20000
8.2 DuckDB + Jepsen 培训
DuckDB 与 Jepsen 的合作意味着数据一致性成为新的卖点。针对金融科技和审计领域:
- 一致性验证工作坊:教授如何使用 Jepsen 测试套件验证 DuckDB 的正确性
- 合规咨询:帮助受监管行业(金融、医疗)设计基于 DuckDB 的数据管道
- 定价参考:企业培训 $2000-$5000/天
8.3 在线 Shell 定制部署
新的在线 Shell 基于 WebAssembly,可以嵌入到任何 Web 应用中:
- 嵌入式分析平台:为客户构建浏览器内的数据分析环境,无需后端服务器
- 教育 SaaS:为数据科学课程提供零配置的 DuckDB 实验环境
- 定价参考:SaaS 订阅 $99-$499/月,定制部署 $10000+
8.4 性能调优服务
Linux v7 内核带来了 10% 的性能提升,但许多用户并不了解如何调优:
- 性能调优包:操作系统内核参数 + DuckDB 配置优化(memory_limit, threads, force_download_threshold 等)
- 基准测试报告:为客户生成定制化的 TPC-H/ClickBench 报告
- 定价参考:$1000-$3000 每次
结语
DuckDB 1.5.2 虽然是一个补丁版本,但其承载的内容密度远超预期。DuckLake v1.0 的生产就绪宣告了"基于 SQL 的湖仓"时代的到来,Jepsen 合作为数据一致性背书,新 Shell 让浏览器成为真正的数据工作台,而 Linux v7 内核的性能提升则是每个用户都能免费获得的"彩蛋"。
对于数据分析师、数据工程师和架构师来说,现在正是深入 DuckDB 生态的最佳时机——工具已经成熟,社区蓬勃发展,变现路径清晰可见。
本文基于 DuckDB 官方博客 Announcing DuckDB 1.5.2 及公开资料编写。所有代码示例均在 DuckDB 1.5.2 上测试通过。