首页 > 其他分享 >BusTub 通关总结

BusTub 通关总结

时间:2023-04-24 22:56:04浏览次数:44  
标签:总结 结点 BusTub Buffer Tree Project page Pool 通关

Project #0 - C++ Primer

是个前期热身项目,考察对 C++ 的掌握。

要求实现一个并发 Trie 支持的 kv 存储,存储 map 到任何类型的 value 的 string key。Trie 中的每个节点存储一个键的单个字符,并且可以有多个子节点,这些子节点表示不同的可能的下一个字符。当到达一个键的结尾时,将设置一个标志来指示其对应的节点是一个结束节点。

例如,考虑在 trie 中插入 kv 对(“ ab”,1)和(“ ac”,“ val”)。这两个键共享同一个父节点 “a”。在左边的子节点中,与键 “ab” 对应的值 1 存储在节点 “b” 中,与键 “ac” 对应的值 “val” 存储在节点 “c” 中。

Project #1 - Buffer Pool

解析

因为磁盘和内存的访问速度存在差异,为了权衡二者,需在内存中建立一个 Buffer Pool,并通过 Buffer Pool Manager (BPM) 管理 physical page 在内存与磁盘之间的移动。BPM 向系统提供获取 page 的接口,系统通过 page_id 向 BPM 索要对应的 page,而不关心该 page 具体存放位置。也就是说,系统并不关心(也不可见)获取这个 page 的过程(从 disk 或 memory 上读取),也不关心 page 可能发生的在 disk 和 memory 间的移动。这些内部的操作都交由 BPM 完成。

Project1 就要求我们实现一个 BPM。它包括三个组件:

  • Extendible Hash Table
  • LRU-K Replacer
  • Buffer Pool Manager Instance

Extendible Hash TableLRU-K ReplacerBuffer Pool Manager 内部的组件。Extendible Hash Table 用于实现 page table 做页面映射 (将 page id 映射为 Buffer Pool 中 frame 的 frame id)。 LRU-K Replacer 用于实现缓存驱逐策略,完成 Buffer Pool 空间不足时 frame 的移除工作。

image-20221207180458200

Disk Manager 已经为我们提供,是实际在 disk 上读写数据的接口。

Project #2 - B+Tree

解析 (上)

解析 (下)

实现 BPM 之后,我们要考虑 BPM 之上的东西,也就是 Access Method,对数据库数据进行读/写的方式,为实现比 Sequential Scan 更快的数据检索,常用哈希索引和树索引。

Project2 要求我们实现一个 B+Tree 索引结构,支持插入 Insert(),点搜索 GetValue(),和删除 Delete(); 还要实现一个索引迭代器,来直接检索所有 leaf page。 并通过 latch crabbing 的方式支持索引并发。该 Project 中官方还提供了 B+Tree 的可视化工具来为本地代码实现生成可视化 B+Tree,并提供在线 B+Tree 生成网站,可通过二者对比进行 Debug。

这里要注意的是,B+Tree 的结点也存储在对应 page 中,我们要理清 B+Tree 涉及的 page 与普通 page 的差别:

另外要关注的就是 B+Tree 内部结点和叶结点的各自的最小和最大 kv 个数。

n 路B+树:n - 1 个 key,n 个 pointer

叶子结点使用 \([0 ~ n-2]\) 范围 array_

内部结点使用 \([0 ~ n-1]\) 范围 array_,第 0 个只有 value (即 pointer) 没有 key (key 设为 INVALID_PAGE_ID)

叶子结点 size 最大是 \(n-1\),最小是 \(\lceil(n - 1)/2\rceil\) ,也即 \(\lfloor n/2\rfloor\)

内部结点 size 最大是 \(n\),最小是 \(\lceil n/2\rceil\) ,也即 \(\lfloor(n+1)/2\rfloor\)

叶子结点设置 maxSize = nMinSize = n / 2,叶子结点大小 minSize ≤ size < maxSize

内部结点设置 maxSize = nMinSize = (n + 1) / 2,内部结点大小 minSize ≤ size ≤ maxSize

Project #3 - Query Execution

解析

BusTub 的整体架构如下:

image-20230409210940627

Project3 我们要实现一个让 BusTub 执行 query 的组件。具体到代码上,要实现基于 火山模型 的 sql 执行器,完成 SeqScan, Insert, Delete, IndexScan, Aggregation, NestedLoopJoin, NestedIndexJoin, Sort, Limit 等 Executor 的逻辑,以及 Top-N 优化规则。

选做部分 Leaderboard Task 是实现 HashJoinExecutor,针对给出的三个 query 设计一些 optimizer rules,自由度也很高,可以自定义任意的优化比如列裁剪、谓词下推、常量折叠等等。

前两个 Project 是一个点,从 Project3 开始,点就连成了面,我们要在自己写的缓存池和 B+Tree 索引上真正的去跑一些算子,这个 Project 的一个难点在于要大量阅读相关源代码。完成 Project3 后,就可以当作一个单机数据库跑一些 sql 了,包括 select,insert/delete,inner/left join,agg,groub by,order by,limit 等。

这里我画了张图便于对代码 (主要是 Catalog, table, index 的结构以及它们之间的关系) 的理解:

image-20230415234907799

Q:我们在 Project 1 中实现的 Buffer Pool 和在 Project 2 中实现的 B+Tree Index 在哪里?

A:实际上就在一系列算子下。例如 SeqScan 算子,需要遍历 table,首先通过数据库的 catalog 找到对应的 table,一个 table 由许多 page 组成,在访问 page 时,就用到了 Buffer Pool。在 Optimizer 中,假如发现 Sort 算子在对 indexed attribute 排序,会将 Sort 算子优化为 IndexScan 算子,这样就用到了 B+Tree Index。

Project #4 - Concurrency Control

解析

解析 (Leaderboard Task)

Project4 要求对并发事务的管理,保证多个事务在数据库并发执行时的隔离性。实现基于 2PL 的事务并发控制,自动为并发事务执行加锁解锁,支持 Repeatable Read、Read Commited、Read Uncommited 三种隔离级别。因为 2PL 不可避免产生死锁,还要实现一个后台死锁检测、死锁解除线程。在此基础上,最后我们还要修改之前实现的 SeqScanInsertDelete 算子,加上适当的锁以实现并发的查询。

选做部分 Leaderboard Task 要求实现 (1) 将谓词下推到 SeqScan 以锁定更少的 tuples; (2) 实现 UpdateExecutor 这样 tuples 就能被就地更新,而不用先 Delete 在 Insert; (3) 将谓词下推到 IndexScanExecutor 来做索引查询。


截止 2023.04.24,GradeScope 上的Leaderboard:

Project 1

这里我对 Extendible Hash Table 直接一把大锁摆烂了

标签:总结,结点,BusTub,Buffer,Tree,Project,page,Pool,通关
From: https://www.cnblogs.com/angelia-wang/p/17351258.html

相关文章

  • 4.24每日总结
       今天是第一阶段验收,王老师说这次的展示的功能比较单一,场景应用的构想也不够完善。今天看到一个组用python写的人脸识别,效果很好,与我们web端相比确实体现了差距。这几天会抓紧时间完善功能和场景应用的问题。......
  • 2020年总结
    时光飞逝,转眼的时间又到了2021年,记得也是去年这个时候写下了,2019年的总结,主要是对测试和开发的一些技术栈的总结,还附有两个xmind图片。今年对以往的过去做一次总结,在2020年这一年中,还是一如既往的坚持博客的编写,今年总共输出了44篇博客,并且在四月份的时候,申请成为博客专家,同时也感......
  • 命令总结
    #########################linux#########################tftp传送文件命令下载到本地:tftp-gr文件名服务器ip(tftp软件打开的ip,一般是window的ip)上传到服务器:tftp-pl文件名服务器ip(tftp软件打开的ip,一般是window的ip)共享复制粘贴sudoapt-getautoremoveopen-vm-......
  • 设计模式总结
    设计模式设计模式(Designpattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。一.Factory(简单工厂)定义:用一个方法去代替构造器或者是new关键字,把......
  • 敏捷开发总结
    简单的说,敏捷开发是一种以人为核心、迭代、循序渐进的开发方法。在敏捷开发中,软件项目的构建被切分成多个子项目,各个子项目的成果都经过测试,具备集成和可运行的特征。换言之,就是把一个大项目分为多个相互联系,但也可独立运行的小项目,并分别完成,在此过程中软件......
  • 大产品与小产品(借鉴于某位大神的总结)
    话不多,言简意赅:  ......
  • 软件开发工程师工作总结(转)
    分享第一条经验:“学历代表过去、能力代表现在、学习力代表未来。”其实这是一个来自国外教育领域的一个研究结果。相信工作过几年、十几年的朋友对这个道理有些体会吧。但我相信这一点也很重要:“重要的道理明白太晚将抱憾终生!”所以放在每一条,让刚刚毕业的朋友们早点看到哈!   ......
  • 个人工作总结(转)
     个人工作总结  2010-04-12作者:ttion 一个人的软件工程一个简单的网页、自助建站、个人Blog、CMS,这是本人自认的站长生涯,我人生的第一桶金也是来自个人建站,对“个人站长”这个词汇总会有点感慨,而一个人的软件工程即始于此,做的第一套系统的名称叫做“免费者内容管理系统”(......
  • SpringMVC 框架总结笔记
    第一章初识SpringMVC1.1SpringMVC概述SpringMVC是Spring子框架SpringMVC是Spring为【展现层|表示层|表述层|控制层】提供的基于MVC设计理念的优秀的Web框架,是目前最主流的MVC框架。SpringMVC是非侵入式:可以使用注解让普通java对象,作为请求处理器【Controller】......
  • [MLIR] CodeGen Pipeline总结
    参考资料:[MLIR]CodeGenPipeline总结-知乎(zhihu.com)本文主要以tensorflow为例,介绍了其接入MLIR后的CodeGen过程,以及简要分析了一些现在常用的CodeGenpipeline。本文是本人在结合博客(CodegenDialectOverview-MLIR-LLVMDiscussionForums)以及相关资料而写......