DeepSeek总结的DuckDB internals 的 设计与实现 (DiDi)
原文:https://github.com/DBatUTuebingen/DiDi/
DuckDBinternals 的设计与实现 (DiDi)
一门关于 DuckDB 关系数据库引擎中精选实现技术的课程。
欢迎!
本讲义材料由 Torsten Grust 开发,用于支持德国图宾根大学数据库研究组面向本科生开设的一门为期 15 周的课程(称为DiDi)。欢迎您以任何您认为合适的方式使用本材料:浏览、学习、提出建议或修正,或者将其拆解以构建您自己的讲义材料。无论何种情况,我都非常乐意收到您的来信:
- 电子邮件:torsten.grust@uni-tuebingen.de
- 网站:https://db.cs.uni-tuebingen.de/grust/
- Bluesky:https://bsky.app/profile/teggy.org
DuckDB 内部实现之旅
本课程沿着路径探讨 DuckDB 关系数据库系统的精选内部实现。15 周的时间不足以详尽讨论 DuckDB 内核中所有有趣的细节。但我仍然希望我能够描绘出一幅具有代表性的图景,说明是什么让 DuckDB 成为一个强大且高效的 SQL 数据库系统,使其能够“在商用笔记本电脑上处理数十亿行数据”。未来的DiDi版本可能会增加、合并或删除一些章节,但截至 2026 年 3 月,章节结构如下:
- 欢迎与设置
- 查询性能谱系
- 内存管理 + 分组聚合
- 大表排序
- 索引的 ART
- 查询执行计划与流水线
- 向量化查询执行
- 查询重写与优化
在图宾根大学,我带领学生从头到尾学习这些章节,但我相信第 4 至 8 章可以按任意顺序阅读。
要跟随 DiDi 的主线和辅助材料,您需要具备基础的 SQL 技能。不过,很少有查询会超出核心的SELECT-FROM-WHERE-GROUP BY-HAVING块。如果您需要了解表格数据模型及其查询语言 SQL 的入门知识,您可能会发现配套课程TaDa有所帮助。TaDa也是围绕 DuckDB 展开的。
DiDi= 幻灯片 + 辅助材料
DiDi的第 ‹N› 章附带一个幻灯片文件slides/DiDi-‹N›.pdf(请参见下面的相关文件层级结构)。请注意,这些幻灯片实际上只讲述了故事的一半。
另一半存在于大约 50 个辅助文件中——主要是 SQL 脚本,也包括用 C、Python 和 awk 编写的代码——这些文件收集在第 ‹N› 章的material/‹N›/目录中。每当一个名为‹nnn›-*的文件包含相关的支持材料时,幻灯片中会包含标签📄#‹nnn›。除了代码,这些文件还包含大量注释——您绝对需要学习(并且最好是运行、修改、动手实践)material/中的这些文件,才能获得预期的、完整的DiDi图景。
要运行这些文件,请切换到material/‹N›/目录,并在那里调用 DuckDB、您的 Python/awk 解释器或 C 编译器:
$cdmaterial/02 $ ./002-sum-quantity.py../../databases/lineitem.csv $ duckdb-f008-sum-quantity.sql $ duckdb D .read 008-sum-quantity.sql我发现,当学生从*.sql文件中将单个 SQL 命令和查询直接剪切并粘贴到 DuckDB CLI 会话中时,他们能最好地利用这些 SQL 脚本。
生成示例数据库实例
大多数 SQL 脚本操作于 TPC-H 基准测试的实例,并假设可以在databases/目录中访问这些数据库。您可以使用generate-databases.sql脚本生成所需的 DuckDB 数据库(以及附带的 CSV 文件):
$cddatabases $ duckdb-fgenerate-databases.sql注意:这将在 DuckDB 数据库文件tpch-sf{1,10,100}.db中分别放置三个规模因子为 1、10、100 的 TPC-H 实例。我们使用 DuckDB 自己的tpch扩展,但请耐心等待:这将需要一段时间(大约 20 分钟)。或者,generate-databases.sql脚本包含了预制的 DuckDB 数据库文件的链接,您可以选择下载这些文件。
致谢
DiDi材料站在了巨人的肩膀上:
- 各种科学论文(我们在幻灯片中提及并链接了它们),
- DuckDB 文档 https://duckdb.org/docs/,
- 博客文章(主要见于 https://duckdb.org/news/),
- 对 DuckDB 的 C++ 代码库的探索 https://github.com/duckdb/duckdb,
- 友好的 DuckDB Discord 社区(https://discord.duckdb.org/)上的讨论,
- 与 DuckDB Labs 那群出色的 DuckDB 开发者的个人交流(通过 Discord 和啤酒),
- SQL 参考/标准,
- 经验,以及最佳实践。
第 02 章(查询性能谱系)是对 Thomas Neumann 精彩的讲义《数据工程基础》中相关讨论的改编和扩展。
幻灯片是使用 Morgan McGuire 的 Markdown 方言 Markdeep 的(大幅修改版)创作的。我使用了 Fabrizio Schiavi 的等宽字体 Pragmata Pro 进行排版。
DiDi文件布局
. ├── slides │ ├── DiDi-01.pdf ├── README.md └── LICENSE