引言
2026 年 6 月 17 日,DuckDB 团队同时发布了两个重要版本:DuckDB 1.5.4(Variegata) 和 DuckDB 1.4.5 LTS(Andium)。作为 1.5.x 系列的第五个补丁版本,1.5.4 聚焦于稳定性修复、崩溃预防和性能优化。更重要的是,团队在公告中透露了令人期待的消息——DuckDB v2.0.0 将于今年秋季发布。
本文将深入分析 1.5.4 版本的关键改进,并探讨即将到来的 v2.0.0 可能带来的变化。
版本概览
| 特性 | DuckDB 1.5.4 (Variegata) | DuckDB 1.4.5 LTS (Andium) |
|---|---|---|
| 发布类型 | 常规补丁发布 | LTS 补丁发布 |
| 发布日期 | 2026-06-17 | 2026-06-17 |
| 支持周期 | 至 v2.0.0 | 长期支持 |
| 主要焦点 | 崩溃修复、性能优化 | 稳定性、向后兼容 |
| 适用场景 | 生产环境推荐升级 | 需要长期稳定的用户 |
关键修复与改进
1. 正确性修复:VARIANT 类型的深度优化
DuckDB 的 VARIANT 类型是其处理半结构化数据的核心功能之一。1.5.4 版本修复了多个与 VARIANT 相关的严重 Bug:
-- 修复前:过滤条件下 VARIANT 读取错误行
-- 修复后:确保过滤条件下 VARIANT 正确读取
CREATE TABLE variant_data AS
SELECT * FROM read_json_auto('data.json');
-- 现在这个查询将返回正确的结果
SELECT
variant_col:field1::VARCHAR AS field1,
variant_col:field2::INTEGER AS field2
FROM variant_data
WHERE variant_col:field1 IS NOT NULL;
另一个重要的修复涉及 MERGE INTO 语句中的目标表和源表绑定逻辑:
-- 修复:WHEN NOT MATCHED 现在只考虑目标表
-- WHEN NOT MATCHED BY TARGET 现在只考虑源表
MERGE INTO target_table t
USING source_table s
ON t.id = s.id
WHEN MATCHED THEN UPDATE SET t.value = s.value
WHEN NOT MATCHED THEN INSERT VALUES (s.id, s.value);
2. JSON 处理能力的增强
JSON 函数是 DuckDB 最受欢迎的功能之一。1.5.4 版本修复了多个 JSON 相关的问题:
-- 修复:json_keys 现在正确处理通配符路径
SELECT json_keys('{"a": {"b": 1, "c": 2}}', '$.a.*');
-- 修复:ignore_errors 参数不再静默接受无效 JSON
SELECT * FROM read_json_auto('data.json', ignore_errors => true);
-- 修复:NULL JSON key 现在被正确拒绝
SELECT json_extract('{"key": "value"}', 'null_key');
3. 崩溃预防:生产环境的定心丸
1.5.4 版本修复了多个可能导致崩溃的问题:
| 问题编号 | 描述 | 影响 |
|---|---|---|
| #21854 | Arrow GeoArrow CRS 序列化中的双重释放和内存泄漏 | GIS 扩展崩溃 |
| #22836 | SQL 管道输出时的进度条崩溃 | CLI 使用崩溃 |
| #23174 | 未设置存储路径时的崩溃 | 配置错误导致崩溃 |
| #23232 | gzip 压缩写入溢出 | Parquet 写入崩溃 |
# Python 中使用 DuckDB 的稳健性测试示例
import duckdb
# 修复后,以下操作不再崩溃
con = duckdb.connect(':memory:')
con.execute("INSTALL parquet; LOAD parquet;")
# 处理大型 Parquet 文件
result = con.execute("""
SELECT
COUNT(*) as total_rows,
SUM(amount) as total_amount
FROM read_parquet('large_data/*.parquet')
""").fetchdf()
print(result)
4. 性能优化
1.5.4 版本包含了几项重要的性能改进:
-- 修复:原生几何 Parquet 统计信息剪枝
-- 现在可以更有效地跳过不需要的 Parquet 行组
SELECT * FROM read_parquet('geo_data.parquet')
WHERE ST_Intersects(geometry, ST_Polygon(...));
-- 新增:OPERATOR_ROW_GROUPS_SCANNED 统计信息
-- 帮助诊断 Parquet 读取性能
SHOW ALL SETTINGS LIKE 'operator_row_groups_scanned';
对于 jemalloc 构建版本,系统堆内存修剪也得到了优化:
# 内存使用对比(jemalloc 构建)
import duckdb
import tracemalloc
tracemalloc.start()
# 执行大量 Parquet 读取
con = duckdb.connect("benchmark.duckdb")
con.execute("CREATE TABLE big_data AS SELECT * FROM read_parquet('data/*.parquet');")
current, peak = tracemalloc.get_traced_memory()
print(f"当前内存: {current / 1024 / 1024:.2f} MB")
print(f"峰值内存: {peak / 1024 / 1024:.2f} MB")
tracemalloc.stop()
5. 其他重要改进
CLI 暗色模式支持:1.5.4 新增了 -dark-mode 和 -light-mode 命令行选项,改善了终端体验:
# 显式指定暗色模式
duckdb -dark-mode
# 显式指定亮色模式
duckdb -light-mode
# 自动检测终端背景颜色(已改进)
duckdb
ATTACH 选项增强:新增实验性的 vacuum_rebuild_indexes 选项:
-- 附加数据库时重建索引
ATTACH 'other.db' AS other_db (vacuum_rebuild_indexes);
安全加固:对多个 DuckDB/Parquet 解压缩和反序列化路径进行了加固,增强了安全性。
从 1.5.4 到 v2.0.0:路线图展望
在公告的最后,DuckDB 团队透露了一个激动人心的消息:v2.0.0 将于今年秋季发布。虽然具体的功能列表尚未公布,但根据 v1.5.x 系列的发展趋势,我们可以推测 v2.0.0 可能包含以下内容:
可能的 v2.0.0 新特性
增强的流处理能力:延续 v1.5.x 的流窗口函数,v2.0.0 可能会提供更完整的流数据处理框架。
更强大的地理空间支持:修复 GeoArrow CRS 序列化等问题的同时,可能会引入更全面的 GIS 功能。
改进的并发事务:基于 v1.5.x 的 OLTP 优化,v2.0.0 可能会提供更完善的 ACID 事务支持。
扩展生态系统:随着 ExtensionKit 和 C# 扩展的推出,v2.0.0 可能会进一步丰富扩展生态。
性能里程碑:v2.0.0 可能会在 TPC-DS 等基准测试中刷新记录。
与传统工具的对比
| 维度 | DuckDB 1.5.4 | PostgreSQL | Pandas | Apache Spark |
|---|---|---|---|---|
| 安装复杂度 | ⭐ 零依赖 | ⭐⭐ 需配置 | ⭐⭐ 需 pip | ⭐⭐⭐⭐ 集群部署 |
| 查询速度 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ |
| 内存效率 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐⭐ |
| SQL 兼容性 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ❌ | ⭐⭐⭐ |
| 扩展生态 | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
| 学习曲线 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐ |
升级建议
生产环境升级策略
# 1. 检查当前版本
duckdb --version
# 2. 备份现有数据库
cp production.duckdb production_backup_$(date +%Y%m%d).duckdb
# 3. 升级 DuckDB CLI
curl -L https://github.com/duckdb/duckdb/releases/download/v1.5.4/duckdb_cli-linux-amd64.zip -o duckdb.zip
unzip -o duckdb.zip
sudo mv duckdb /usr/local/bin/
# 4. 验证升级
duckdb --version
duckdb -c "SELECT version();"
Python 环境升级
# pip 升级
pip install --upgrade duckdb
# 或使用 uv
uv pip install --upgrade duckdb
# 验证
import duckdb
print(duckdb.__version__) # 应显示 1.5.4
变现建议
对于企业用户,升级到 1.5.4 可以带来以下直接收益:
减少生产事故:修复的崩溃问题可以直接降低运维成本。每个因崩溃导致的停机事件可能花费数千美元,而升级的成本几乎为零。
提升分析效率:性能优化意味着同样的硬件可以处理更多数据,节省云基础设施费用。
为 v2.0.0 做准备:提前升级到 1.5.4 可以为秋季的 v2.0.0 迁移做好准备,避免集中升级的风险。
数据安全:安全加固修复了潜在的漏洞,保护企业数据资产。
开发者体验:CLI 暗色模式和更好的错误消息提高了开发效率,间接降低了人力成本。
结语
DuckDB 1.5.4 (Variegata) 虽然是一个补丁版本,但它修复了众多关键问题,显著提升了稳定性和安全性。配合即将推出的 v2.0.0,DuckDB 正在成为数据分析领域越来越有力的竞争者。
同时,DuckCon #7 也将在阿姆斯特丹举行,这是了解 DuckDB 最新动态和社区交流的好机会。无论是线上观看还是现场参与,都不容错过。
提示:v2.0.0 即将到来,建议密切关注 DuckDB 官方博客和 GitHub 仓库,以便第一时间获取更新信息和迁移指南。
