关键字:
KingbaseES、SQL、数据类型、Numeric、人大金仓
NumericCompress
列存的优势之一是,相似的(同一列)的数据在物理上具有存储的局部性,因此方便进行数据压缩,在引入前两篇文章中介绍的NumericBi64以及NumericBi128的基础上,可以采用同样的思想对Numeric的存储进行压缩
NumericCompress基本原理
Numeric压缩的基本原理是对不同的numeric进行编码,通过记录该批numeric的最大最小值以及某一个numeric的编码就可以解压缩出该numeric的具体值,这种方法在压缩与解压缩时需要额外的开销。
NumericCompress具体方法
Numeric在系统中传入并进行压缩时,一共有多种不同类型,主要为一般的Numeric(short,long,nan等)以及使用Bi存储具体值的NumericBi(64/128),NumericCompress将试图把Numeric的具体值转换为具有相同scale的整型,int32或int64,对于无法转换为int32或int64的,在压缩中另做处理。
对于值部分能够使用int32或int64表示的,具体压缩方法如下:
首先使用DELTA_COMPRESS,即对numeric表示的数进行重新编码为该numeric与numeric最小值的和(或差)
使用RLE_COMPRESS(optional)对重新编码后的表示numeric的整型进行RLE编码
对于值部分不能使用int32或int64表示的,具体压缩方法如下:
- 使用LZ4_COMPRESS进行压缩
NumericCompress压缩单元结构
压缩结束以后,产生一个压缩单元,其中有其中存储压缩的元数据以及压缩后的Numeric数据。
压缩后的数据主要由以下三部分组成:
Header:存放Numeric压缩元数据,包括压缩使用的方式,压缩后的数据中包含的数据类型等
Dscales:存放不同bitmap表示压缩后数据中各个变量的具体数据类型,如在同时有int32以及int64表示的numeric的情况下,使用bitmap,并用1代表int32,用0代表int64
Values:压缩后的具体值,顺序为int32、int64、其他numeric