列存引擎的存储基本单位是CU(Compression Unit,压缩单元),即表中一列的一部分数据组成的压缩数据块。行存引擎中是以行作为单位来管理,而当使用列存储时,整个表整体被按照不同列划分为若干个CU,实例如图9-25所示。

图9-25 CU划分方式
如图9-25所示,假设以6万行作为一个单位,则一个12万行、3列宽的表,则被划分为8个CU,每个CU对应一个列上的6万个列数据。图中有Col0、Col1、Col2、Col3四列,数据按照行切分了两个Row group(行组),每个Row group有固定的行数。针对每个Row group按照列做数据压缩,形成压缩单元CU(Compression unit)。每个Row group内部各个列的CU的行边界是完全对齐的。当然,大部分时候,CU在经过压缩后,因为数据特征与压缩率的不同,文件大小会完全不同,例如图9-26所示.

图9-26 压缩单元示意图
为了管理表对应的CU,与执行器层进行对接来提供各种功能,列存储引擎使用了CUDesc(压缩单元描述符)表来记录一个列存表中CU对应的元信息,如图9-27所示:

图9-27 列存引擎整体架构图
注: Cmn 表示第m列的cuid是n的压缩单元。
每个CU对应一个CU Desc的记录,在CU desc里记录了整个CU的事务时间戳信息、CU的大小、存储位置、magic校验码、min/max等信息。
与此同时,每张列存表还配有一张Delta表,Delta表自身为行存储表。当有少量的数据插入到一张列存表时,数据会被暂时放入Delta表,等到到达阈值或满足一定条件或操作时再行整合为CU文件。Delta表可以帮助我们避免单点数据操作带来的很重的CU操作与开销。
设计采用级别的多版本并发控制,删除通过引入Virtual Column Bitmap来标记删除。Bitmap是多版本的。




