Ch04-AmDB 之 Chunk

Ch04-AmDB 之 Chunk

December 4, 2022
AmDB
amdb

Chunk 由多个 Row 组成

为了能说明 Chunk,这里先说明下 Row。

1. Row #

1.1 接口定义 #

class Row {
public:
  Row(Arena* arena, RowDescriptor* desc);
  Status SetColValue(uint32_t row_id, uint32_t col_id, const expr::ExprValue& value);
  expr::ExprValue GetColValue(uint32_t row_id, uint32_t col_id);
private:
  // using Tuple = char*;
  Tuple* data_;

1.2 实现原理 #

将一行数据的所有列编码后保存在一段连续的空间内,然后使用 Tuple* 指向该段连续的空间。访问的时候借用 保存在 RowDescriptor##cols##bytes_offset 中的 offset 很容易就可以取出每个列的值。

2. Chunk #

2.1 接口定义 #

class Chunk {
public:
  Chunk(const Chunk& c) = delete;
  Chunk& operator=(const Chunk& c) = delete;

  void AddRow(Row* row);

  void ResetCursor() { cursor_ = 0; }
  void Next() { ++cursor_; }
  bool ReachEnd() { return cursor_ >= select_.size(); }

private:
  RowDescriptor* row_desc_{nullptr};

  uint32_t cursor_ = 0;
  std::vector<Row*> select_;
}

2.2 实现原理 #

禁用了拷贝构造语义和拷贝赋值语义,只允许读和追加写,不支持随机写。实现原理也比较简单,将所有 Row 保存到其属性 select 中,然后对外提供迭代器语义方便后续操作。 引入 chunk 主要是为了方便 executor 批量操作,也为了能够使整个 AmDB 更加贴合向量化模型。