零基础学Rust,请加~微 xingzixi2 咨询
目前市面上有很多数据库管理系统(DBMS)。但没有一种数据库系统是适用于所有场景的。不同的数据库系统在设计时都会根据特定的使用案例做出不同的权衡,DuckDB 也不例外。本文将解释 DuckDB 的目标,以及我们如何通过技术手段实现这些目标。首先,DuckDB 是一个支持结构化查询语言(SQL)的关系型(面向表格)数据库管理系统(DBMS)。
DuckDB 的关键特点
简单
SQLite 是全球部署最广泛的数据库管理系统。其安装简单、嵌入式操作的特点是其成功的核心。DuckDB 采用了这些简单性和嵌入式操作的理念。
DuckDB 没有外部依赖,无论是编译时还是运行时。对于发布版本,DuckDB 的整个源代码树被编译成两个文件,一个头文件和一个实现文件,称为“合并文件(amalgamation)”。这种做法极大简化了部署和与其他构建过程的集成。构建 DuckDB 所需的仅仅是一个支持 C++11 的编译器。
DuckDB 不需要安装、更新和维护单独的 DBMS 服务器软件。DuckDB 不是作为独立进程运行的,而是完全嵌入到宿主进程中。对于 DuckDB 主要面向的分析型使用案例,这样的设计具有将数据高效传输进出数据库的额外优势。在某些情况下,DuckDB 可以在不复制数据的情况下处理外部数据。例如,DuckDB Python 包可以直接在 Pandas 数据上运行查询,而无需导入或复制数据。
可移植
由于没有外部依赖,DuckDB 具有极高的可移植性。它可以为所有主要操作系统(Linux、macOS、Windows)和 CPU 架构(x86、ARM)进行编译。DuckDB 可在资源受限的小型边缘设备上部署,也可以在拥有 100+ CPU 核心的大型多 TB 内存服务器上运行。通过 DuckDB-Wasm,DuckDB 甚至可以在 Web 浏览器上运行,甚至在移动电话上运行。
DuckDB 提供了 Java、C、C++、Go、Node.js 等语言的 API。
功能丰富
DuckDB 提供了强大的数据管理功能。它对复杂查询提供广泛的 SQL 支持,并有大量函数库、窗口函数等。DuckDB 通过我们自定义的、批量优化的多版本并发控制(MVCC)提供事务性保证(ACID 属性)。数据可以存储在持久化的单文件数据库中。DuckDB 支持二级索引,以加速查找单一表项的查询。
DuckDB 与 Python 和 R 深度集成,支持高效的交互式数据分析。
高效
DuckDB 被设计用来支持分析型查询工作负载(也称为在线分析处理,OLAP)。这些工作负载的特点是需要处理存储数据集的较大部分,例如全表聚合或多个大型表之间的连接,且查询复杂且执行时间较长。数据的变化通常也具有较大规模,可能是追加多行数据,或者表的多个部分在同一时刻发生变化。
为了高效支持这些工作负载,减少每个值的 CPU 周期至关重要。实现这一目标的最新技术是向量化或即时查询执行引擎。DuckDB 使用列式向量化查询执行引擎,查询仍然是解释执行,但会在一个操作中处理一批数据(一个“向量”)。这大大减少了传统系统(如 PostgreSQL、MySQL 或 SQLite)中按行处理的开销。向量化查询执行使得 OLAP 查询的性能得到了显著提升。
可扩展
DuckDB 提供了一种灵活的扩展机制,允许定义新的数据类型、函数、文件格式以及新的 SQL 语法。实际上,DuckDB 的许多关键功能(如对 Parquet 文件格式、JSON、时区支持,以及对 HTTP(S) 和 S3 协议的支持)都是作为扩展实现的。扩展在 DuckDB Wasm 中同样适用。用户贡献的扩展可以作为社区扩展使用。
免费
DuckDB 的开发始于主要开发者在荷兰的公共服务工作时。我们认为将我们工作的成果免费提供给荷兰或其他地方的任何人是我们的责任和义务。这就是为什么 DuckDB 采用了非常宽松的 MIT 许可证,并且项目的知识产权由 DuckDB 基金会持有的原因。我们欢迎任何人贡献代码,前提是他们遵守我们的行为准则。
完善的测试
虽然 DuckDB 最初由一个研究小组创建,但它从来不是为了作为一个研究原型而开发的,而是为了成为一个稳定且成熟的数据库系统。为了保证系统的稳定性,DuckDB 在持续集成中进行了大量的测试。DuckDB 的测试套件目前包含数百万个查询,其中包括来自 SQLite、PostgreSQL 和 MonetDB 测试套件的查询。测试会在各种平台和编译器上重复进行。每一个拉取请求都会经过全面的测试,只要测试通过才会合并。
除了这个测试套件,我们还进行了各种压力测试,模拟 DuckDB 在高负载下的表现。我们运行 TPC-H 和 TPC-DS 基准测试,并且在多个客户端并行访问的情况下进行各种测试。
同行评审论文和学位论文
- 《Runtime-Extensible Parsers》(CIDR 2025)
- 《Robust External Hash Aggregation in the Solid State Age》(ICDE 2024)
- 《These Rows Are Made for Sorting and That's Just What We'll Do》(ICDE 2023)
- 《Join Order Optimization with (Almost) No Statistics》(硕士论文,2022)
- 《DuckDB-Wasm: Fast Analytical Processing for the Web》(VLDB 2022 演示)
- 《Data Management for Data Science - Towards Embedded Analytics》(CIDR 2020)
- 《DuckDB: an Embeddable Analytical Database》(SIGMOD 2019 演示)
使用 DuckDB 构建的项目
要了解使用 DuckDB 的项目,请访问 DuckDB 的 Awesome 资源库。
站在巨人的肩膀上
DuckDB 使用了多个开源项目的组件,并从科学出版物中汲取灵感。我们对此深表感激,以下是一个概述:
- 执行引擎:向量化执行引擎的灵感来自于论文《MonetDB/X100: Hyper-Pipelining Query Execution》。
- 优化器:DuckDB 的优化器参考了《Dynamic programming strikes back》 和《Unnesting Arbitrary Queries》两篇论文。
- 并发控制:我们的 MVCC 实现受论文《Fast Serializable Multi-Version Concurrency Control for Main-Memory Database Systems》的启发。
- 二级索引:DuckDB 的二级索引支持基于《The Adaptive Radix Tree: ARTful Indexing for Main-Memory Databases》论文中的方法。
- SQL 窗口函数:DuckDB 的窗口函数实现使用了《Efficient Processing of Window Functions in Analytical SQL Queries》论文中的段树聚合方法。
- SQL 不等式连接:DuckDB 的不等式连接实现使用了 IEJoin 算法,参考了《Lightning Fast and Space Efficient Inequality Joins》论文。
DuckDB 还支持多种浮点值压缩算法,包括 Chimp、Patas 和 ALP 等。SQL 解析器使用了 PostgreSQL 解析器,正则表达式引擎使用了 Google 的 RE2,字符串格式化使用 fmt 库,UTF 处理使用 utf8proc 库,排序和时间处理则使用了 ICU 库。
我们在测试框架方面使用了 Catch2 单元测试框架,SQL 逻辑测试参考了 SQLite,并使用 SQLancer 工具进行结果验证。通过 SQLsmith,我们生成随机查询进行额外的测试。JSON 解析使用高性能的 yyjson 库。