DeepSeek总结的DuckDB internals 的 设计与实现 (DiDi)
原文https://github.com/DBatUTuebingen/DiDi/DuckDBinternals 的设计与实现 (DiDi)一门关于 DuckDB 关系数据库引擎中精选实现技术的课程。欢迎本讲义材料由 Torsten Grust 开发用于支持德国图宾根大学数据库研究组面向本科生开设的一门为期 15 周的课程称为DiDi。欢迎您以任何您认为合适的方式使用本材料浏览、学习、提出建议或修正或者将其拆解以构建您自己的讲义材料。无论何种情况我都非常乐意收到您的来信电子邮件torsten.grustuni-tuebingen.de网站https://db.cs.uni-tuebingen.de/grust/Blueskyhttps://bsky.app/profile/teggy.orgDuckDB 内部实现之旅本课程沿着路径探讨 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