跳到主要内容

执行格式

Vector 是执行阶段用于存储内存数据的容器格式。 DataChunk 是一组 Vector 的集合,例如可用于表示 PhysicalProjection 算子中的列列表。

数据流

Goose 使用向量化查询执行模型。 Goose 中所有算子都针对固定大小 Vector 进行优化。

这一固定大小在代码中通常称为 STANDARD_VECTOR_SIZE。 默认 STANDARD_VECTOR_SIZE 为 2048 条元组。

Vector 格式

Vector 在逻辑上表示“单一类型数据数组”。Goose 支持多种 vector format,可用不同物理表示存储同一逻辑数据,从而实现更高压缩率,并潜在支持全链路压缩执行。下文列出支持的格式。

Flat Vectors

Flat vector 物理上是连续数组,这是标准的未压缩格式。 在 Flat vector 中,逻辑表示与物理表示一致。

Flat Vector example

Constant Vectors

Constant vector 物理上仅存储一个常量值。

Constant Vector example

当数据元素大量重复时,Constant vector 很有用。例如函数调用中常量表达式结果在每行都相同,使用 Constant vector 只需存储一次该值。

SELECT lst || 'goose'
FROM range(1000) tbl(lst);

由于 goose 是字符串字面量,其值对每行都相同。若使用 Flat vector,需要为每行重复存储一次 'goose';而 Constant vector 仅需存储一次。

存储层在解压 constant compression 时也会产出 Constant vector。

Dictionary Vectors

Dictionary vector 物理上由子向量与选择向量组成,选择向量存储对子向量的索引。

Dictionary Vector example

存储层在解压 dictionary compression 时会产出 Dictionary vector。 与 Constant vector 类似,Dictionary vector 也常由存储层生成。 反序列化字典压缩列段时,数据会保存在 Dictionary vector 中,从而在执行阶段尽量保持压缩态。

Sequence Vectors

Sequence vector 物理上由一个 offset 与一个 increment 组成。

Sequence Vector example

Sequence vector 适合高效存储递增序列,通常用于 row identifier。

Unified Vector Format

不同 vector format 的特性非常利于优化。比如当函数所有参数都是常量时,只需计算一次并输出 Constant vector。 但若为每个函数的每种 vector 组合都写特化代码,会因组合爆炸而不可维护。

因此,当你希望不关心具体 vector 类型而做通用处理时,可以使用 UnifiedVectorFormat。 它本质上是 Vector 内容的统一视图,任意 Vector 类型都可转换到该格式。

复杂类型

String Vectors

为高效存储字符串,Goose 使用 string_t 结构。

struct string_t {
union {
struct {
uint32_t length;
char prefix[4];
char *ptr;
} pointer;
struct {
uint32_t length;
char inlined[12];
} inlined;
} value;
};

短字符串(<= 12 bytes)会内联在结构体中;较长字符串则通过指针指向辅助字符串缓冲区中的数据。 length 字段可避免频繁调用 strlen 与空指针检查。 prefix 用于比较时快速失败:当前缀不匹配时可直接判定字符串不相等,无需继续追指针。

List Vectors

List vector 由一系列 list entry 与一个子向量组成。子向量存储列表中的实际值,list entry 描述每一行列表如何从子向量中切片构造。

struct list_entry_t {
idx_t offset;
idx_t length;
};

offset 表示子向量中的起始位置,length 表示该行列表长度。

List vector 可递归嵌套。对于嵌套列表,list vector 的子向量本身仍是 list vector。

例如,下面是一个 BIGINT[][] 类型 Vector 的示意表示:

{
"type": "list",
"data": "list_entry_t",
"child": {
"type": "list",
"data": "list_entry_t",
"child": {
"type": "bigint",
"data": "int64_t"
}
}
}

Struct Vectors

Struct vector 存储一组子向量。子向量数量与类型由 struct schema 定义。

Map Vectors

Map vector 在内部表示为 LIST[STRUCT(key KEY_TYPE, value VALUE_TYPE)]

Union Vectors

UNION 在内部复用了与 STRUCT 相同的结构。 第一个“子向量”固定为 UNION 的 Tag Vector,用于记录每一行当前使用的是 UNION 的哪种分支类型。