CMU15445 Query Execution
一些问题
- 数据库里面一条数据就是一个 tuple,它有一个唯一 rid,由 page_id 和 slotnum 表示,当我们构建索引时,是选择一些列(每个 index 都有一个 schema,表示使用哪些列构建索引) tuple 序列化转化为字节数组,之后以这个字节作为 key,rid 作为 value 插入到 b+ 树中。一个问题是如果这个索引很长怎么办(那就意味着用来构建索引的列很多以及每列的取值又有很多)
Aggregate
- stream aggregate
- hash aggregate
分布式计算带来的不同聚合函数计算模式
- CompleteMode
- FinalMode
- PartialMode
join
- nested loop join
- hash join
- njl as hj
sort limit
- sort
- limit
- sort limit as topn,使用一个 sorted vector + limit, 或者用一个优先队列也可以。
点击查看代码
std::sort(sorted_tuples_.begin(), sorted_tuples_.end(), [this](const Tuple &a, const Tuple &b) {
// ...
});
点击查看代码
std::priority_queue<Tuple, std::vector<Tuple>, Compare> tuple_queue_(Compare(plan_->GetOrderBy(), plan_->OutputSchema()));
optimizing
- Spring 2023 实现好了
OptimizeMergeFilterScan,将 filter 向下 merge 进 seqscan,而如果 filter 的属性拥有索引,又可以写成 indexscan - filter 尽可能往下推,可能的模式有 (filter, nlj),(filter, hj),(filter, projection)等,这个写了很久
- 我们以及尽可能将 filter 往下推了,如果一个 filter 里面含有 3>5, 5==6,这种那就为空
遇到的一些坑
- 如果你在子执行器的 init 中做了一些特殊的操作,你需要考虑在父执行器中的 init 的调用的顺序(一般不太需要注意)
- 这里面有很多的 unique_ptr,使用时要小心,如果你选择使用 unique_ptr,就需要在成员初始化列表中进行初始化,如果你选择使用指针,那么有些情况这个迭代器是不允许拷贝的,那么你也只能在成员初始化列表中初始化,或者你使用 new 构造一个迭代器,然后移动这个迭代器,记得要在析构函数中释放;
- agg 中构造一个
integer_null要使用ValueFactory::GetNullValueByte,不能使用Value自带的构造方法,这里卡了非常非常久 - agg 是 pipeline breaker,需要在 init 中将所有结果计算出来,包括空表
建议先去读一下 bustub_instance.cpp 和 bustub_ddl.cpp,
result


浙公网安备 33010602011771号