搜索快捷键 cmd + k | ctrl + k

常见问题解答

概览

谁创建了 DuckDB?

DuckDB 由荷兰阿姆斯特丹荷兰数学与计算机科学研究中心 (CWI)Mark Raasveldt 博士Hannes Mühleisen 博士 创建。Mark 和 Hannes 成立了 DuckDB 基金会,用于募集捐款并资助 DuckDB 的开发与维护。Mark 和 Hannes 也是 DuckDB Labs 的联合创始人,该公司围绕 DuckDB 提供商业服务,并聘用了多位 DuckDB 的核心贡献者。

为什么要叫 DuckDB?

鸭子是神奇的动物。它们会飞、会走、会游泳。它们几乎可以靠任何东西生存。它们对环境挑战具有极强的韧性。鸭子的叫声能让人们起死回生,并激发了数据库研究。因此,它们是这种多功能且富有韧性的数据管理系统的完美吉祥物。

DuckDB 是开源的吗?

DuckDB 完全开源,基于 MIT 许可证发布,其开发工作在 GitHub 的 duckdb/duckdb 仓库中进行。DuckDB 的所有组件均可在该许可证下的免费版本中获得:DuckDB 没有所谓的“企业版”。

DuckDB 的大部分知识产权已特意转移至一家非营利性实体,旨在将项目的许可与商业公司 DuckDB Labs 隔离开来。DuckDB 基金会的章程也确保了 DuckDB 将永久保持 MIT 许可证下的开源状态。CWI (Centrum Wiskunde & Informatica) 在 DuckDB 基金会董事会中占有一席之地,向 DuckDB 基金会的捐款将直接资助 DuckDB 的开发。

有关 DuckDB 相关组织的更多信息,请参阅下一个问答。

DuckDB 是该 MIT 许可开源项目的名称。

DuckDB 基金会 是一家非营利性组织,拥有 DuckDB 项目的知识产权。DuckDB 基金会的章程确保 DuckDB 将永久保持 MIT 许可证下的开源状态。

DuckDB Labs 是一家位于阿姆斯特丹的公司,为 DuckDB 提供商业支持服务。DuckDB Labs 聘用了 DuckDB 项目的核心贡献者。

MotherDuck 是一家获得风险投资的公司,正在使用 DuckDB 构建一个混合云/本地平台。MotherDuck 与 DuckDB Labs 签订了开发服务合同,且 DuckDB Labs 持有 MotherDuck 的部分股份。请参阅合作伙伴关系公告了解详情。若要了解更多关于 MotherDuck 的信息,请查阅 CIDR 2024 关于 MotherDuck 的论文 以及 MotherDuck 文档

我发现一个名称中带有“duck”的项目。它与 DuckDB 有官方关联吗?

以下项目与 DuckDB 有官方关联:

其他项目通常不与 DuckDB 项目相关联。请查看它们的网站、README 文件和许可证以获取更多详细信息。

该项目的官方名称是什么?

在正式交流中,我们仅将 DuckDB 称为“DuckDB”,并避免使用其他名称和拼写,如“DDB”、“the Duck”和“DuckDb”。当然,这些替代名称也被广泛理解,欢迎您使用,但首选使用“DuckDB”。

使用 DuckDB

DuckDB 可以将数据保存到磁盘吗?

DuckDB 支持持久化存储,并将数据库存储为单个文件,其中包含数据库中存在的所有表、视图、索引、宏等。DuckDB 的存储格式使用压缩的列式表示,这种格式既紧凑又允许高效的批量更新。DuckDB 也可以在内存模式下运行,此时数据不会持久化到磁盘。此外,DuckDB 还可通过 ducklake 扩展DuckLake 格式保存数据。

我应该在什么类型的存储设备上运行 DuckDB(例如本地磁盘、网络附加存储)?

运行 DuckDB 所使用的存储类型对性能有显著影响。通常情况下,与 HDD 相比,使用 SSD(SATA 或 NVMe SSD)可获得更优越的性能。

存储的位置根据工作负载的不同而有很大差异

  • 对于只读工作负载, DuckDB 数据库可以存储在本地磁盘以及远程端点(如 HTTPS)和云对象存储(如 AWS S3 及类似服务商)上。
  • 对于读写工作负载, 将数据库存储在实例附加存储上可获得最佳性能。网络附加云存储(如 AWS EBS)同样适用,其性能可以通过保证 IOPS 设置进行微调。根据我们的经验,强烈建议不要在网络附加存储 (NAS) 上为读写工作负载运行 DuckDB 或任何其他数据库管理系统。 这些配置通常速度较慢,并会导致难以排查的虚假故障。

DuckDB 是内存数据库吗?

将 DuckDB 视为内存数据库是一种常见的误解。虽然 DuckDB 可以在内存中工作,但它不是内存数据库。DuckDB 可以利用可用内存进行缓存,同时也完全支持基于磁盘的持久化,并支持将大于内存的操作卸载到磁盘。

DuckDB 是基于 Arrow 构建的吗?

DuckDB 在内部并不使用 Apache Arrow 格式。但是,DuckDB 支持通过 arrow 社区扩展读取和写入 Arrow。它还可以通过 pyarrow 直接在 Arrow 上执行 SQL 查询。

DuckDB 的数据库文件在不同的 DuckDB 版本和客户端之间可移植吗?

自 0.10.0 版本(2024 年 2 月发布)以来,DuckDB 在读取数据库文件时实现了向后兼容,即较新版本的 DuckDB 总是能够读取由旧版本 DuckDB 创建的数据库文件。DuckDB 还基于尽力而为的原则提供了部分向前兼容性。有关更多详细信息,请参阅存储页面。不同 DuckDB 客户端(例如 Python 和 R)之间的兼容性也得到保证:由一个客户端创建的数据库文件可以被其他客户端读取。

DuckDB 如何处理并发?多个进程可以写入 DuckDB 吗?

请参阅有关处理并发的文档以及“从多个进程写入 DuckDB”一节。

若要使用多个 DuckDB 客户端处理同一数据集,请考虑通过 ducklake 扩展使用 DuckLake 格式

是否有官方的 DuckDB Docker 镜像?

您可以使用官方的 DuckDB Docker 镜像来运行 DuckDB 命令行客户端。

请注意,在大多数情况下,您不需要容器来运行 DuckDB:您可以简单地将其进程内 (in-process) 部署在您的客户端应用程序中,或者作为独立的命令行二进制文件运行。

如何在同一台计算机上使用多个 DuckDB 客户端?

您可以在同一台计算机上安装多个 DuckDB 客户端。这些客户端是分别安装的,并且可以拥有不同的 DuckDB 版本。例如,您可以在 R 中使用 DuckDB 1.3.2 包,将 DuckDB 1.4.0 作为 CLI 客户端,并在 Python 中使用预览版本。

如果您不确定进程中使用的 DuckDB 版本,请运行 PRAGMA version 查询,它会打印出 DuckDB 的版本信息。

在哪里可以了解更多关于 DuckDB 的信息?

DuckDB 拥有官方的文档博客资源库。同时,还有一些第三方资源可以帮助您进一步了解 DuckDB。

性能

DuckDB 使用 SIMD 吗?

DuckDB 不使用显式 SIMD(单指令多数据)指令,因为它们极大地复杂化了可移植性和编译工作。相反,DuckDB 使用隐式 SIMD,我们非常努力地编写 C++ 代码,以便编译器能够为特定的硬件自动生成 SIMD 指令。举例来说,将 DuckDB 移植到 Apple Silicon 架构仅耗时 10 分钟,这就是这种方法的一个优势。

DuckDB 的可扩展性是如何运作的?

DuckDB 是一个单节点数据库系统,因此它利用垂直扩展,即利用更多资源(CPU、内存和磁盘)来支持更大的数据集。DuckDB 已在拥有 100 多个 CPU 核心和数 TB 内存的机器上进行了测试。

DuckDB 的原生数据库格式也可以扩展到数 TB 的数据,但这需要一些规划——请参阅“使用大型数据库”页面

对于处理大规模数据集和/或在同一数据集上协作,请考虑使用 DuckLake lakehouse 格式。

我想将 DuckDB 与其他系统进行基准测试,该怎么做?

我们欢迎将 DuckDB 的性能与其他系统进行比较的实验。为了确保公平比较,我们有几点建议。首先,尽量使用预览版本,它通常比上一个稳定版本有显著的性能改进。其次,考虑参考我们的 DBTest 2018 论文 《公平基准测试之难:数据库性能测试中的常见陷阱》,获取关于避免基准测试常见问题的指南。第三,研究 DuckDB 的性能指南,其中包含确保最佳性能的最佳实践。最后,请报告 DuckDB 的版本(稳定版请注明版本号,夜间构建版请注明提交哈希值)。

使用 DuckDB

DuckDB 是用于数据科学还是数据工程工作负载?

DuckDB 的设计兼顾了数据科学和数据工程工作负载。因此,您可以根据需要,高度灵活地使用 DuckDB 的 SQL 语法,也可以非常精确地使用它。

对于经常以交互方式运行查询的数据科学用户,DuckDB 提供了多种快速探索数据集的机制。例如,可以通过自动推断模式加载 CSV 文件,使用 CREATE TABLE tbl AS FROM 'input.csv'。此外,还有许多被称为“友好 SQL”的 SQL 速记法,用于更简洁的表达式,例如 GROUP BY ALL 子句

对于数据工程用例,DuckDB 允许完全控制加载过程,因此可以使用 CREATE TABLE tbl schema 语句定义精确的架构,并使用指定 CSV 方言(分隔符、引号等)的 COPY 语句进行填充。大多数友好 SQL 扩展都可以简单地重写为与 PostgreSQL 完全兼容的 SQL 查询。例如,GROUP BY ALL 子句可以用 GROUP BY 子句和显式的列列表来代替。

DuckDB 的典型用例是什么?

DuckDB 的用例大致可以分为三大类。即,DuckDB 可用于用户进行的交互式数据分析(“数据科学”)以及作为自动化数据处理的管道组件(“数据工程”)。DuckDB 还可以部署在一些新颖的架构中,在这些架构中,传统上无法运行分析型数据库管理系统,但由于 DuckDB 的可移植性,它完全可以胜任。这些架构包括在浏览器中运行 DuckDB(使用 WebAssembly 客户端)以及在智能手机上运行。此外,DuckDB 的扩展功能还解锁了诸如地理空间分析以及与其他数据库系统的深度集成。最后,在某些情况下,DuckDB 甚至不需要数据也能成为数据库

我希望在 DuckDB 中实现功能 X,我该怎么做?

DuckDB 中的功能可以通过不同方式实现:在 DuckDB 主项目中实现,或者作为核心扩展社区扩展实现。如果您有 DuckDB 的功能需求,请遵循以下指南:

  • 如果您有功能想法,请在 DuckDB GitHub Discussions 的“Ideas”部分提出议题。DuckDB 团队会监控这些想法,并随着时间的推移实现高频请求的功能。例如,我们最近发布了 Avro 社区扩展以支持读取 Avro 文件,这是问题追踪器中请求最多的功能。
  • 如果您想在 DuckDB 主项目中实现某个功能,请在 GitHub Discussions 或我们的 Discord 服务器上与 DuckDB 团队进行讨论。团队可以核实该想法及提出的实现方式是否符合项目的长期愿景。
  • 如果您想将功能实现为扩展,请考虑将其提交至 社区扩展仓库

请注意,聘用 DuckDB 主要贡献者的公司 DuckDB Labs 提供 DuckDB 咨询服务,其中包括在 DuckDB 中实现功能或开发 DuckDB 扩展。

发布与开发

官方支持哪些 DuckDB 客户端和版本?

虽然 DuckDB 数据库是一个相对小巧、精简的代码库,但它拥有涵盖数十个客户端和扩展的广泛覆盖面。目前,官方社区支持适用于以下组件:

此支持涵盖以下次要版本:

  • 最新 LTS(长期支持)版本,目前为 1.4
  • 当前版本,目前为 1.5

更多详细信息,请参阅 DuckDB 社区支持政策

DuckDB 的新版本发布频率如何?

新功能版本(例如 v1.2.0)每 3–5 个月发布一次。错误修复版本(例如 v1.1.3)在功能版本发布后的每 2–4 周发布一次。您可以在发布日历中找到最近的发布版本。

下一个版本什么时候发布,我能期待哪些功能?

请查看发布日历以获取 DuckDB 下一个稳定版本的计划发布日期,并查看开发路线图以了解未来一年计划开发的功能。

如何为 DuckDB 文档做出贡献?

DuckDB 网站由 GitHub Pages 托管,并从 duckdb/duckdb-web 仓库部署。当从台式机浏览文档时,每个页面的顶部都有一个“Page Source”按钮,可将您导航至其 Markdown 源文件。非常欢迎提交拉取请求 (Pull Request) 来修复问题或扩展有关 DuckDB 功能的文档部分。在开启拉取请求之前,请查阅我们的贡献者指南

关于 DuckDB 的官方来源有哪些?

以下我们列出了有关 DuckDB 和 DuckLake 项目的官方权威来源。使用其他来源时请务必谨慎。在从其他来源下载二进制文件和安装脚本时,您应格外小心。

网站

社交媒体