DeepSeek总结的DuckDB internals 的 设计与实现 (DiDi)

原文:https://github.com/DBatUTuebingen/DiDi/

D uckDB i nternals 的 计与 现 (DiDi)

一门关于 DuckDB 关系数据库引擎中精选实现技术的课程。

欢迎!

本讲义材料由 Torsten Grust 开发,用于支持德国图宾根大学数据库研究组面向本科生开设的一门为期 15 周的课程(称为 DiDi)。欢迎您以任何您认为合适的方式使用本材料:浏览、学习、提出建议或修正,或者将其拆解以构建您自己的讲义材料。无论何种情况,我都非常乐意收到您的来信:

DuckDB 内部实现之旅

本课程沿着路径探讨 DuckDB 关系数据库系统的精选内部实现。15 周的时间不足以详尽讨论 DuckDB 内核中所有有趣的细节。但我仍然希望我能够描绘出一幅具有代表性的图景,说明是什么让 DuckDB 成为一个强大且高效的 SQL 数据库系统,使其能够"在商用笔记本电脑上处理数十亿行数据"。未来的 DiDi 版本可能会增加、合并或删除一些章节,但截至 2026 年 3 月,章节结构如下:

  1. 欢迎与设置
  2. 查询性能谱系
  3. 内存管理 + 分组聚合
  4. 大表排序
  5. 索引的 ART
  6. 查询执行计划与流水线
  7. 向量化查询执行
  8. 查询重写与优化

在图宾根大学,我带领学生从头到尾学习这些章节,但我相信第 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 编译器:

bash 复制代码
$ cd material/02
$ ./002-sum-quantity.py ../../databases/lineitem.csv
$ duckdb -f 008-sum-quantity.sql
$ duckdb
D .read 008-sum-quantity.sql

我发现,当学生从 *.sql 文件中将单个 SQL 命令和查询直接剪切并粘贴到 DuckDB CLI 会话中时,他们能最好地利用这些 SQL 脚本。

生成示例数据库实例

大多数 SQL 脚本操作于 TPC-H 基准测试的实例,并假设可以在 databases/ 目录中访问这些数据库。您可以使用 generate-databases.sql 脚本生成所需的 DuckDB 数据库(以及附带的 CSV 文件):

bash 复制代码
$ cd databases
$ duckdb -f generate-databases.sql

注意:这将在 DuckDB 数据库文件 tpch-sf{1,10,100}.db 中分别放置三个规模因子为 1、10、100 的 TPC-H 实例。我们使用 DuckDB 自己的 tpch 扩展,但请耐心等待:这将需要一段时间(大约 20 分钟)。或者,generate-databases.sql 脚本包含了预制的 DuckDB 数据库文件的链接,您可以选择下载这些文件。

致谢

DiDi 材料站在了巨人的肩膀上:

第 02 章(查询性能谱系)是对 Thomas Neumann 精彩的讲义《数据工程基础》中相关讨论的改编和扩展。

幻灯片是使用 Morgan McGuire 的 Markdown 方言 Markdeep 的(大幅修改版)创作的。我使用了 Fabrizio Schiavi 的等宽字体 Pragmata Pro 进行排版。

DiDi 文件布局

复制代码
.
├── slides
│   ├── DiDi-01.pdf
├── README.md
└── LICENSE
相关推荐
a9511416422 小时前
mysql查询分析中如何快速识别全表扫描_通过EXPLAIN中的type列检查
jvm·数据库·python
coNh OOSI2 小时前
Redis——Windows安装
数据库·windows·redis
weixin_424999362 小时前
mysql如何防止索引被错误使用_mysql查询计划强制约束
jvm·数据库·python
Fᴏʀ ʏ꯭ᴏ꯭ᴜ꯭.2 小时前
Redis主从复制配置全攻略
数据库·redis·笔记
m0_613856292 小时前
Golang怎么实现测试跳过条件_Golang如何根据环境或条件跳过不适用的测试用例【操作】
jvm·数据库·python
csdn2015_2 小时前
修改分类信息的时候将分类异步写入redis
数据库·redis·bootstrap
STAT abil2 小时前
MySQL 的mysql_secure_installation安全脚本执行过程介绍
数据库·mysql·安全
SelectDB2 小时前
从 T+1 到分钟级:金城银行基于 Apache Doris 构建高可靠、强一致的实时数据平台
大数据·数据库·数据分析
abc123456sdggfd2 小时前
bootstrap如何修改输入框获取焦点时的光晕
jvm·数据库·python