CMU15445-project3-坑和收获总结
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1hvKz8Ot-1658066439309)(C:\Users\54351\Desktop\Mynotes\CMU15445\CMU15445-lab3.assets\image-20220717205747950.png)]](https://i-blog.csdnimg.cn/blog_migrate/fae952d7afffc881179d637a486c943a.png)
排名拉了,没精力优化了
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uj80SfBS-1658066439311)(C:\Users\54351\Desktop\Mynotes\CMU15445\CMU15445-lab3.assets\image-20220717205854345.png)]](https://i-blog.csdnimg.cn/blog_migrate/497eacd1c33bed12357e9bfd73299509.png)
太折磨了太痛苦了,看代码的时间比写代码的时间还多,很多天都处于完全没法动键盘的状态。
感觉这个lab更像一个读代码任务,文档只讲了需要实现的笼统需求,大部分跟下手代码相关的信息全在代码里面,需要从测试文件,Executor的构造函数等地方延申读各种头文件,理解了之后才能拿来使用且完成任务,问题是还不一定能用对。
TASK #0 - BEFOR START
!!!gradescope究极大BUG!!!
上传评分的时候,自己的代码没有任何格式错误,也会在格式检查时失败:

仔细一看会发现不是自己文件的问题,官方给出的解决办法如下:
把最新的 src/include/storage/page/tmp_tuple_page.h 一起打包进提交文件即可
开始之前
value,tuple,table,column,schema
value就是最小单位,值
tuple相当于一行,存多个值
table是一张表,提供了迭代器去访问,迭代器按行(tuple)遍历
column是列的名字(抬头)
schema则存了一串column,表示这张表有哪些列
AbstractExecutor
SQL拆分成一棵执行树之后,其中的节点的功能承担者,也是这次实验主要要完成的部分。
构造执行树时不会构造Executor,而是用后面的AbstractPlanNode来构造树,只有在执行这棵树的时候会初始化对应的Executor来执行。
// 每个执行器需要初始化的东西都不一样,一般是初始化指向表头的迭代器指针,或者自己定义的一些辅助循环的值
// 拿seq_scan来说,就需要在这里将迭代器指针指向表头。
void Init()
// 需要做到调用一次next就输出且只输出一组tuple的功能,输出是通过赋值*tuple参数,并return true
// 如果没有能输出的了,return false
void Next(Tuple *tuple, RID *rid)
// Schema相当于存储了表的表头名字,OutputSchema用来指出此节点需要输出哪些列(哪些表头需要考虑在内)
virtual const Schema *GetOutputSchema() = 0;
ExecutorContext
(AbstractExecutor构造函数的参数之一)
上下文信息,也就是说这次执行所用到的一些关键信息
// 这个Catalog至关重要,存储了一个数据库的全部表格信息的索引,提供了对表格的操作。
// 只有这个Catalog是我们可能会用到的,比如在seq_scan中需要利用它获取目标表
Catalog *catalog_;
AbstractPlanNode
(AbstractExecutor构造函数参数之二)
用于存储节点有关的信息,AbstractExecutor利用用里面的信息来完成任务。
// Schema是表每列的表头名字,OutputSchema用来指出此节点需要输出哪些列
Schema *OutputSchema()
// 获取孩子节点(我们实现executor的时候用不上,在执行树的时候才用得上)
// 在一些需要从子节点获取tuple的操作用得上,比如 join
AbstractPlanNode *GetChildAt(uint32_t child_idx)
std::vector<AbstractPlanNode *> &GetChildren()
例子:SeqScanPlanNode成员函数,AbstractExecutor可以在这里获取TableOid和Predicate
// 这个在ExecutionEngine里面用于判断当前节点的类型
PlanType GetType()
// Predicate:谓词,返回值全是真值的表达式,AbstractExpression就是一颗表达式树。
AbstractExpression *GetPredicate()
// 结合Catlog可以得到当前Executor需要的表格内容
table_oid_t GetTableOid()
AbstractExpression
表达式类,一颗表达式树中的节点,比如比较,聚合,或者常量,column元素。其中column表达式也作为了column类的成员之一。
不同的表达式实现的功能差距交大,这个是非常重要的一个类,每一个executor的代码都会用到。
ComparisonExpression:用于比较,实例化后做为predicate_谓词(下面例子中的predicate就是此类的实例化),或者having(在aggregation中会用到)。
返回的是一个装载Value类中的bool值,需要用value.GetAs<bool>()得到这个值,用于判断是否满足比较的条件(比较的细节:比如是>还是<,就不用我们关心了,交给Evaluate函数就行)
Value value = plan_->GetPredicate()->Evaluate(tuple, schema)
ColumnValueExpression:列元素的表达值,有一个很大的作用,它的Evaluate函数能返回当前tuple中哪一个value是对应这个column的。
Value value = column.GetExpr()->Evaluate(tuple, schema);
// 或者判断当前join是左连接还是右链接,并根据传入的左右俩tuple返回连接对应的值
Value value = plan_->OutputSchema()->GetColumn(i).GetExpr()->EvaluateJoin(
&left_tuple_,
plan_->GetLeftPlan()->OutputSchema(),
&right_tuple_,
plan_->GetRightPlan()->OutputSchema());
-
ConstantValueExpression:常数表达式,返回值永远是一个常数,没用过。 -
AggregateValueExpression:在AggregateExecutor中用到,作用和ColumnValueExpression类似,用于找出属于当前column的这个值。(AggregateExecutor的测试函数在传入output
数据库管理系统执行器实现详解

本文详细介绍了数据库管理系统执行器的实现,包括抽象执行器、执行上下文、计划节点和表达式。讨论了顺序扫描、插入、更新、删除、嵌套循环连接、哈希连接、聚合、限制和唯一性去重等操作的执行过程。强调了Catalog、Schema、Column在数据表信息管理中的作用,以及在处理表达式和谓词时的技巧。同时,指出了Gradescope评分系统的格式错误问题和解决方案。
最低0.47元/天 解锁文章
2029

被折叠的 条评论
为什么被折叠?



