本文将深入探讨GaussDB中的向量化处理技术,涵盖其常见特性和实际应用。先详细介绍存储数据和即时数据(正在处理的数据)的按列组织格式,并阐述其优势。后通过分析SIMD(单指令多数据流)处理技术的一般原理,探讨在GaussDB中的巧妙运用。
一、列处理和即时数据
关系数据库管理系统(DBMS)将数据组织在表中,表包含列和行。表通常按行存储,同一行的数据存放在一起。表也可以按列存储,此时表的行被划分为行组,同一行组中同一列的数据存放在一起。
图1展示了一个员工表。在左侧,表按行组织;在右侧,表按列组织,每个行组包含两行。
图1:按行组织和按列组织的员工表
磁盘上存储的持久化数据和内存中正在处理的即时数据都可以按列组织。持久化数据的行组通常较大,旨在实现更好的压缩率和更高的IO效率。而即时数据的行组相对较小,通常只有几千行,旨在减少内存消耗并实现更好的CPU缓存效率。
GaussDB向量SQL引擎就是为即时数据的列式处理而设计的。即时数据在GaussDB向量SQL引擎中的处理单元为 VectorBatch。Vector代表单列的行组,VectorBatch 代表多个单列的行组,参见图2。
GaussDB向量SQL引擎算子接收一个VectorBatch输出一个VectorBatch。GaussDB向量SQL 引擎算子以批处理模式处理一个 SQL 查询:一次处理一批行,而不是一次处理一行。每个 VectorBatch 包含最多1000行。GaussDB 向量 SQL 引擎算子使用面向列的处理和优化来高效处理 VectorBatch。
例如,当一个算子需要计算多个列的哈希值时,它首先完成对 VectorBatch 中所有行的第一列的哈希值计算,然后是第二列,以此类推。最后,它累加所有列的哈希值。
按列存储和处理数据有几个好处:
1. 按列存储的数据可以更好地压缩
按列存储的数据可以更好地压缩。同一列的数据通常具有较高的重复率或相似的值。这些是压缩算法实现高压缩率的良好数据特征。例如,在员工表中,DeptID(部门ID)列的数据具