Project3 Query Execution 心得
一、概述
首先要说:这个 project很有趣很硬核!从这个 project 开始才感觉自己在数据库方面真正成长了!
第一个 project :buffer pool manager 相对独立且简单,说白了就是使用 LRU-K 算法维护一个 page 数组,2022 fall 又加了一点内容:使用可扩展哈希来将对外暴露的 page_id 和数组下标映射起来。 2023 sping 又添加了 COW 的功能,不过 MITOS 已经写过相关 lab 了,也不眼馋了。
第二个 project 虽然烧脑,但是更加独立,有种 干货是有但 trick 更多的意味(个人感觉,手写 b+tree有一点浪费时间)。 虽然对 b+tree 有了全面的认识,但除了知道这是数据库的存储引擎外,和 bustub 也没有更多的互动。
但是第三个 project!我太喜欢了!这才是学数据库的感觉!太爽了!大量的源码阅读带来极致的好奇心的满足,如果说前两个 project 都是数据库的组件,这个 project 开始,终于要从宏观的角度观察数据库了!
同时想要独立完成 project 的同学不能心急,我自己的经验是:如果是第一次接触 project3 的内容,至少先沉下心来读 +调试 10 小时以上的源码,才有思路动手开始写,不然直接上手就是浪费时间或者糊里糊涂抄答案,没有任何意义。
最后这篇博客有两个目的:
- 记录我的学习心得,而不是project 的答案,我自己在开始做这个 project 时最大的难点是有一种“有劲没处使”的感觉,即我不怕智力挑战,但是怕的是我连怎么开始这个挑战都不明白,所以墙裂建议大家一定要先去读源码、跟源码!
- (以我自己微薄的力量尽可能地)受人以渔,所以会记录我自己怎么读源码,怎么调试 bug。
二、写的很好的相关博客
https://blog.csdn.net/Kprogram/article/details/125837906 :这位博主对源码的分析比较多
https://zhuanlan.zhihu.com/p/570917775:迟先生(bustub 源码重要贡献者)对 bustub 的说明,建议自己读完源码之后有了自己的感悟再来看这篇文章,才能有更深的体会
三、如何读 bustub源码
最好的方式就是跟一个 sql 语句的执行过程:
建议使用 clion在 tools/shell.cpp 中使用 debug 模式进行调试,如果使用 CLion,记得加参数:--disable-tty,它的含义是含义是禁用终端窗口(TTY)。这意味着在执行命令时,不会弹出一个新的终端窗口,而是在 CLion 的控制台输出中直接显示命令的结果。这个选项可以避免终端窗口的干扰。
比如我要跟一个 insert 语句的执行过程:
先执行建表语句 create table t1(v1 int, v2 varchar(128), v3 int);
然后执行insert into t1 values (0, '