搜索快捷键 cmd + k | ctrl + k
为什么选择 DuckDB

市面上有许多数据库管理系统 (DBMS)。但不存在一种“万能”的数据库系统。所有系统都在不同的权衡中,以更好地适应特定的使用场景。DuckDB 也不例外。在此,我们将尝试解释 DuckDB 的目标,以及我们为何且如何通过技术手段来实现这些目标。首先,DuckDB 是一个支持结构化查询语言 (SQL)关系型(面向表)DBMS

DuckDB 的主要特性

简单

SQLite 是世界上部署最广泛的 DBMS。其安装简单和嵌入式进程内操作是其成功的核心。DuckDB 采纳了这些关于简单性和嵌入式操作的理念。

DuckDB 没有任何外部依赖,无论是在编译期间还是运行时。对于发行版,整个 DuckDB 源代码树被编译为两个文件:一个头文件和一个实现文件,即所谓的“合并版本”(amalgamation)。这极大地简化了部署和在其他构建过程中的集成。要构建 DuckDB,只需要一个可用的 C++11 编译器即可。

对于 DuckDB,无需安装、更新和维护任何 DBMS 服务器软件。DuckDB 不作为单独的进程运行,而是完全嵌入在宿主进程中。对于 DuckDB 针对的分析型用例,这具有高速数据传输的额外优势。在某些情况下,DuckDB 可以直接处理外部数据而无需复制。例如,DuckDB 的 Python 包可以直接对 Pandas 数据运行查询,而无需导入或复制任何数据。

可移植

由于没有依赖项,DuckDB 极其易于移植。它可以针对所有主流操作系统(Linux、macOS、Windows)和 CPU 架构(x86、ARM)进行编译。它既可以部署在小型、资源受限的边缘设备上,也可以部署在拥有 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 周期至关重要。目前数据管理领域实现这一点的最先进技术是向量化或即时 (JIT) 查询执行引擎。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-HTPC-DS 基准测试,并运行各种由多个客户端并行使用 DuckDB 的测试。

同行评审论文与学位论文

使用 DuckDB 构建的项目

要了解使用 DuckDB 的项目,请访问 Awesome DuckDB 仓库

站在巨人的肩膀上

DuckDB 使用了来自各种开源项目的一些组件,并从科学出版物中汲取灵感。我们对此深表感谢。以下是概述: