hyper的DataBlock中采用了三种压缩策略。
signle value 压缩:这种事当在一个block中列的值为单值的时候才用的。
排序字典压缩:一般而言,string会用这种压缩方式,这样方便于做比较操作,比如等号,大于等等
截断压缩:这个压缩算法是只存了数据相对于min只的偏移量,这个压缩算法不会用在string和double 上面
数据会在交给消费者前被解压。
JIT会根据程序执行期间的code信息,来优化指令集,比如可以提高CPU的分支预测准确度,以此提高代码的效率。
比如我们的存取数据的流程如下:
但是由于我们的系统里面有不同的压缩策略:
所以应该的逻辑是这样的:
这样会导致了分支预测上面CPU对于预测错误的分支有CPU的时间的开销。
还有一种解决方案是对这个代码的组合进行展开:
但是,如果用查询引擎中的JIT方式来编译代码:由于如果K个列,每个列都有P段压缩方式,那么就需要P^K个code路径,对JIT 编译器来说,太繁重了。所以在向量化的方式来存取数据的时候,用的是预编译的code。这个预编译的code有各种列和列的压缩对应的信息,然后直接判断是那种组合,直接取数据就可以了。
所以,Hyper对取数据那部分抽成了一个函数,这个函数采用预编译的方式来取数据,这个函数里面每次取的数据是8K行,