Gauss行列存储压缩总结

举报
大威天龙:- 发表于 2020/12/31 12:05:32 2020/12/31
【摘要】 对数据进行压缩能够有效地减少磁盘IO、网络IO以及数据存储成本,但对数据的压缩和解压操作也会消耗额外的CPU资源、影响数据的访问与存储性能。所以需要根据业务需求在压缩率与解压缩速率之间进行权衡,来选择一个较优的压缩算法。

简介

对数据进行压缩能够有效地减少磁盘IO、网络IO以及数据存储成本,但对数据的压缩和解压操作也会消耗额外的CPU资源、影响数据的访问与存储性能。所以需要根据业务需求在压缩率与解压缩速率之间进行权衡,来选择一个较优的压缩算法。

Gaussdb的行列存引擎在对数据进行压缩处理过程中,会根据数据特征自适应选择较优的压缩算法。

行存压缩

对于行存压缩表,以页为单位进行压缩处理。

给行存表开启压缩:

create table row_tbl (att1 type1, att2 type2) with ( orientation = row, compression = yes);

1. Delta 差分压缩

又称差分编码/增量编码,只存储数据间的差异diff,适用于数据改变很小的场景。对于要压缩的每一页,差分压缩采用以下步骤:

    1. 对于每一列,确定最大值MaxVal和最小值MinVal,其中MinVal将用作差分的基准。同时由MaxValMinVal可以确定存储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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。