Gauss行列存储压缩总结
简介
对数据进行压缩能够有效地减少磁盘IO、网络IO以及数据存储成本,但对数据的压缩和解压操作也会消耗额外的CPU资源、影响数据的访问与存储性能。所以需要根据业务需求在压缩率与解压缩速率之间进行权衡,来选择一个较优的压缩算法。
Gaussdb的行列存引擎在对数据进行压缩处理过程中,会根据数据特征自适应选择较优的压缩算法。
行存压缩
对于行存压缩表,以页为单位进行压缩处理。
给行存表开启压缩:
create table row_tbl (att1 type1, att2 type2) with ( orientation = row, compression = yes);
1. Delta 差分压缩
又称差分编码/增量编码,只存储数据间的差异diff,适用于数据改变很小的场景。对于要压缩的每一页,差分压缩采用以下步骤:
1. 对于每一列,确定最大值MaxVal和最小值MinVal,其中MinVal将用作差分的基准。同时由MaxVal和MinVal可以确定存储diff所需的最小字节数bytes。
2. 列中的值将会被原值与MinVal的差值diff替换,且需确保diff非负,diff的字节数小于bytes。
2. Prefix 前缀压缩
前缀压缩首先会检查同一列内的数据,得到同一列内所有数据的共同前缀preFixStr并保存到元信息结构体中。列中每个数据只保存除了前缀外的部分,前缀指向唯一一个共同的前缀preFixStr。
3. Dict 字典压缩
字典压缩首先会检查同一列内的重复值,如果某一值出现的次数达到要求则将其加入字典。列中的值将会直接指向字典中与其重复的值。
列存压缩
对于Gaussdb中的列存压缩表,相对于行存以页为单元进行压缩,列存以CU为单元具有天然的压缩优势,并且以列为单位扫描能进一步减小磁盘IO提高查询速度。指定的压缩等级越高,则数据的压缩率越高。
create table col_tbl (att1 type1, att2 type2) with ( orientation = column, compression = high);
列存压缩除了支持差分压缩以及字典压缩外,还支持RLE压缩、zlib压缩与lz4。
1. RLE 压缩
又称游程编码(Run-Length Encoding),当数据存在大量连续的相同值时,会采用RLE压缩把重复的数据存储为一个数据值和计数。
2. lz4 与 zlib
zlib 压缩能使数据有更高的压缩率,但压缩/解压缩速度很慢,当压缩等级为high时可能采用;
lz4 压缩在压缩/解压缩速度方面表现很好,压缩率低于zlib, 当压缩等级为middle时可能采用;
两者的对比测试:
压缩算法 | 压缩率 | 压缩速度 | 解压速度 |
zlib | 2.743 | 90 MB/s | 400 MB/s |
lz4 | 2.101 | 740 MB/s | 4530 MB/s |
友商的压缩实现
1. GreenPulm
2. SQL server
Sql server的页压缩同样支持前缀压缩与字典压缩:
前缀压缩(支持前缀的不完全匹配):
字典压缩(支持整页的字典):
3. leveldb
Leveldb中以块为压缩单位,使用google开源的数据压缩库Snappy进行压缩。
4. Oracle
Oracle支持字典压缩,以及ZLIB、LZ0等压缩算法。
5. Teradata
Teradata 支持字典压缩以及ZLIB。
- 点赞
- 收藏
- 关注作者
评论(0)