常见问题
概览
DuckDB 的开发者是谁?
DuckDB 由 Mark Raasveldt 博士 和 Hannes Mühleisen 教授 以及来自世界各地的 许多其他贡献者 共同维护。Mark 和 Hannes 成立了 DuckDB 基金会,该基金会负责收集捐赠并资助 DuckDB 的开发和维护。Mark 和 Hannes 也是 DuckDB Labs 的联合创始人,DuckDB Labs 提供围绕 DuckDB 的商业服务。其他几位 DuckDB 贡献者也与 DuckDB Labs 有关联。
DuckDB 的最初开发是在荷兰阿姆斯特丹的 Centrum Wiskunde & Informatica (CWI) 的 数据库架构组 进行的。
为什么叫 DuckDB?
鸭子是神奇的动物。它们会飞、会走、会游泳。它们也几乎可以靠任何东西生存。它们对环境挑战相当有弹性。鸭子的歌声能把人从死亡中带回来,并 激发数据库研究。因此,它们是多功能且有弹性的数据管理系统的完美吉祥物。而且,徽标设计起来也简单。
DuckDB 是开源的吗?
DuckDB 在 MIT 许可下完全开源,其开发在 GitHub 上的 duckdb/duckdb
仓库 中进行。DuckDB 的所有组件都可以在此许可下的免费版本中使用:没有 DuckDB 的“企业版”。
DuckDB 的大部分知识产权已被特意转移到一个非营利实体,以将项目的许可与商业公司 DuckDB Labs 分离。DuckDB 基金会的 章程 也确保 DuckDB 永久保持在 MIT 许可下开源。CWI (Centrum Wiskunde & Informatica) 在 DuckDB 基金会董事会中占有一个席位,对 DuckDB 基金会的捐赠直接资助 DuckDB 的开发。
有关 DuckDB 周围组织的更多信息,请参阅下一个问答对。
DuckDB、DuckDB 基金会、DuckDB Labs 和 MotherDuck 有什么关系?
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 中实现功能 X。我该如何操作?
DuckDB 中的功能可以通过不同的方式实现:在主 DuckDB 项目中,作为 核心扩展 或 社区扩展。如果您有 DuckDB 的功能请求,请遵循以下指南:
- 如果您有功能想法,请在 DuckDB GitHub Discussions 的“想法”部分 中提出问题。DuckDB 团队会监控这些想法,并随着时间的推移实现经常请求的功能。例如,我们最近发布了 Avro 社区扩展 以支持读取 Avro 文件,这是问题跟踪器中最常请求的功能。
- 如果您想在主 DuckDB 项目中实现某个功能,请在 GitHub Discussions 或 我们的 Discord 服务器 上与 DuckDB 团队讨论。团队可以验证该想法和提议的实现是否符合项目的长期愿景。
- 如果您想将某个功能作为扩展实现,请考虑将其提交到 社区扩展仓库。
请注意,DuckDB Labs 是雇佣 DuckDB 主要贡献者的公司,提供 DuckDB 咨询服务,其中可以包括在 DuckDB 中或作为 DuckDB 扩展实现功能。
使用 DuckDB
DuckDB 可以将数据保存到磁盘吗?
DuckDB 支持 持久化存储,并将数据库存储为单个文件,其中包含数据库中存在的所有表、视图、索引、宏等。DuckDB 的 存储格式 使用压缩的列式表示,它紧凑但允许高效的批量更新。DuckDB 也可以在 内存模式 下运行,其中不持久化任何数据到磁盘。DuckDB 还可以通过 ducklake
扩展 将数据保存为 DuckLake 格式。
我应该在什么类型的存储上运行 DuckDB(例如,本地磁盘、网络附加存储)?
用于运行 DuckDB 的存储类型对 性能有显著影响。一般来说,使用固态硬盘(SATA 或 NVMe SSD)比机械硬盘具有卓越的性能。
存储位置根据工作负载的不同而有很大差异。
- 对于只读工作负载, DuckDB 数据库可以存储在本地磁盘和远程端点,例如 HTTPS 和云对象存储,例如 AWS S3 和类似提供商。
- 对于读写工作负载, 将数据库存储在实例附加存储上可获得最佳性能。网络附加云存储(例如 AWS EBS)也有效,其性能可以通过保证的 IOPS 设置进行微调。根据我们的经验,我们强烈建议不要将 DuckDB — 或任何其他数据库管理系统 — 用于读写工作负载在 网络附加存储 (NAS) 上运行。这些设置通常速度慢,并导致难以排除的虚假故障。
DuckDB 是内存数据库吗?
DuckDB 是一个内存数据库是一个常见的误解。尽管 DuckDB 可以在内存中工作,但它不是一个内存数据库。DuckDB 可以利用可用内存进行缓存,它还完全支持基于磁盘的持久化和将 大于内存的操作卸载 到磁盘。
DuckDB 是基于 Arrow 构建的吗?
DuckDB 内部不使用 Apache Arrow 格式。但是,DuckDB 支持使用 arrow
社区扩展 从 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 客户端?
您可以在同一台计算机上安装多个 DuckDB 客户端。这些客户端单独安装,并且可以有不同的 DuckDB 版本。例如,您可以在 R 中使用 DuckDB 1.2.1 包,将 DuckDB 1.2.2 作为 CLI 客户端,并在 Python 中使用预览版。
如果您不确定进程中使用的 DuckDB 版本,请运行 PRAGMA version
查询,该查询会打印 DuckDB 的版本。
性能
DuckDB 使用 SIMD 吗?
DuckDB 不使用显式 SIMD(单指令多数据)指令,因为它们会极大地增加可移植性和编译的复杂性。相反,DuckDB 使用隐式 SIMD,我们竭尽全力以某种方式编写 C++ 代码,使编译器可以为特定硬件自动生成 SIMD 指令。举例说明为什么这是一个好主意,将 DuckDB 移植到 Apple Silicon 架构只花了 10 分钟。
DuckDB 的可伸缩性如何?
DuckDB 是一个单节点数据库系统,因此它利用垂直伸缩性,即利用更多资源(CPU、内存和磁盘)来支持更大的数据集。DuckDB 已在拥有 100 多个 CPU 内核和数 TB 内存的机器上进行过测试。
DuckDB 的原生数据库格式也支持数 TB 的数据,但这需要一些规划——请参阅 “处理大型数据库”页面。
对于处理大规模数据集和/或在同一数据集上协作,请考虑使用 DuckLake 数据湖格式。
我想将 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 版本发布频率如何?
新功能版本(例如 v1.2.0)每 3-5 个月发布一次。错误修复版本(例如 v1.1.3)在功能版本发布后每 2-4 周发布一次。您可以在 发布日历 中找到最近的发布。
是否有 DuckDB 的开发路线图?
是的,请参阅 开发路线图。
我如何为 DuckDB 文档做出贡献?
DuckDB 网站由 GitHub Pages 托管,并从 duckdb/duckdb-web
仓库部署。当从台式计算机浏览文档时,每个页面顶部都有一个“页面源”按钮,可导航到其 Markdown 源文件。欢迎提交拉取请求以修复问题或扩展 DuckDB 功能的文档部分。在打开拉取请求之前,请查阅我们的 贡献者指南。