Ch04-AmDB 之 Chunk
December 4, 2022
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 更加贴合向量化模型。