CMU15445 Query Execution

一些问题

  1. 数据库里面一条数据就是一个 tuple,它有一个唯一 rid,由 page_id 和 slotnum 表示,当我们构建索引时,是选择一些列(每个 index 都有一个 schema,表示使用哪些列构建索引) tuple 序列化转化为字节数组,之后以这个字节作为 key,rid 作为 value 插入到 b+ 树中。一个问题是如果这个索引很长怎么办(那就意味着用来构建索引的列很多以及每列的取值又有很多)

Aggregate

  1. stream aggregate
  2. hash aggregate

分布式计算带来的不同聚合函数计算模式

  1. CompleteMode
  2. FinalMode
  3. 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,这种那就为空

遇到的一些坑

  1. 如果你在子执行器的 init 中做了一些特殊的操作,你需要考虑在父执行器中的 init 的调用的顺序(一般不太需要注意)
  2. 这里面有很多的 unique_ptr,使用时要小心,如果你选择使用 unique_ptr,就需要在成员初始化列表中进行初始化,如果你选择使用指针,那么有些情况这个迭代器是不允许拷贝的,那么你也只能在成员初始化列表中初始化,或者你使用 new 构造一个迭代器,然后移动这个迭代器,记得要在析构函数中释放;
  3. agg 中构造一个 integer_null 要使用 ValueFactory::GetNullValueByte,不能使用 Value 自带的构造方法,这里卡了非常非常久
  4. agg 是 pipeline breaker,需要在 init 中将所有结果计算出来,包括空表

建议先去读一下 bustub_instance.cppbustub_ddl.cpp,

result

ref

  1. https://www.zhihu.com/column/c_1605901992903004160
posted @ 2024-01-14 15:43  o0yo  阅读(33)  评论(0)    收藏  举报