列存储的压缩算法【转】

本次分享内容由三个部分组成:算法

 

  • 列存储数据组织实现
  • 智能索引的实现
  • 自适应压缩算法

目前数据库主流数据组织技术分为数据按行存储和数据按列存储,达梦数据库表数据的存储方式同时支持行存储和列存储。行存储是以记录为单位进行存储的,数据页面中存储的是完整的若干条记录;列存储是以列为单位进行存储的,每个列的全部行数据都存储在一块儿,一个段只存储一个列的数据,并且一个指定的页面中存储的都是某一个列的连续数据。

列存表的存储方式有如下几个优势:
数据库

同一个列的数据都是连续存储的,能够加快某一个列的数据查询速度(相对行存减少没必要要IO);函数

原厂解读:达梦数据库列存储技术原理与实现(有彩蛋)

连续存储的列数据,具备更大的压缩单元和数据类似性,能够得到远优于行存储的压缩效率;性能

条件扫描借助数据区的统计信息进行精确过滤,能够进一步减小IO,提升扫描效率(智能索引)。测试

下面咱们主要介绍达梦数据库的列存储的技术特色及具体实现,并详细介绍列存储的数据组织方式、智能索引的实现、自适应压缩算法设计。大数据

1ui

列存储数据组织实现编码

达梦的列存储表又叫HUGE表,是创建在HTS表空间上的(全称HUGE TABLESPACE)。这个表空间与普通的表空间不一样。普通的表空间,数据是经过段、簇、页来管理的,而且以固定大小(4K、8K、16K、32K)的页面为管理单位;而HTS至关于一个简单的文件系统,建立一个HTS,其实就是建立一个空的目录。在建立一个HFS表以后,数据库会在指定的HTS表空间目录下建立一系列的目录及文件,文件系统结构以下图所示:加密

原厂解读:达梦数据库列存储技术原理与实现(有彩蛋)

从上图能够看出,在HTS目录下成功建立HFS表,系统内部须要通过如下步骤: 首先,在HTS目录下建立这个表对应的模式目录。目录名为“SCH+长度为9的ID号”组成的字符串。spa

其次,在模式目录下建立对应的表目录。表目录也是一样的道理,表目录名为“TAB+长度为4的ID号”组成的字符串。表目录中存放的是这个表中全部的文件。

再次,在新建立表时,每个列对应的一个以dta为后缀的文件,文件大小能够在建表时指定,默认为64M,文件名为“COL+长度为4的列号+_+长度为10的文件号”。例如,在上图中,0000表示第1列,0001表示第2列……;0000000000表示第1个文件,0000000001表示第2个文件……最初一个列只有一个文件便可,当随着数据量不断增加,一个文件已放不下以后,系统会自动建立新的文件来存储不断增加的数据。

对于一个文件,其内部存储是按照区来管理的,区是文件内部数据管理的最小单位,也是惟一的单位(相似于行存的页)。一个区中,能够存储单列数据的行数是经过建立表时指定的,一经指定,在这个表的生命过程就不能再修改。

一个区内,存储的仅仅是数据而已,对于ABLE属性的列,存储的还有相应的标志。每个区的开始位置及长度在文件内都是4K对齐的。对于一个HFS表,相应的还配备一个辅助表来管理其数据。

由于在上面介绍的文件中只存储了数据,辅助表用来管理以及辅助系统用户操做这些数据,该辅助表是在建立HFS表时系统自动建立的。辅助表中每一条记录对应文件中的一个数据区,辅助表包括下面15列:

  1. COLID:表示当前这条记录对应的区所在的列的列ID号;
  2. SEC_ID:表示当前这个记录对应的区的区ID号,每个区都有一个ID号,而且惟一;
  3. FILE_ID:表示这个区的数据所在的文件号;
  4. OFFSET:表示这个区的数据在文件中的偏移位置,4K对齐;
  5. COUNT:表示这个区中存储的数据总数(有可能包括被删除的数据);
  6. ACOUNT:表示这个区中存储的实际数据行数;
  7. N_LEN:表示这个区中存储的数据在文件中的长度,4K对齐的;
  8. N_:表示这个区中的数据中包括的值的行数;
  9. N_DIST:表示这个区中全部数据互不相同的行数;
  10. MAX_VAL:表示这个区中的最大值,精确值;
  11. MIN_VAL:表示这个区中的最小值,精确值;
  12. SUM_VAL:表示这个区中全部值的和,精确值;
  13. CPR_FLAG:表示这个区是否压缩;
  14. ENC_FLAG:表示这个区是否加密;
  15. CHKSUM:用来较验的,该功能暂未启用。

前面7列是用来控制数据存取的,根据这些信息就能够知道这个区的具体存储位置、长度及基本信息。后面8列都是用来对这个区进行统计分析的。其中,COLID和SEC_ID的组合键为辅助表的聚簇关键字。

实际上数据库对列存数据的查找过程就是经过对辅助表信息的检索,利用辅助信息操纵HTS目录下文件的过程。

2

智能索引的实现

列存表作条件扫描能够借助数据区的统计信息进行精确过滤,能够进一步减小IO,提升扫描效率。数据区的统计信息是数据库系统自动维护的,在必定程度上能够替代BTree索引,因此被一些厂商称为“智能索引”。

下图为区最大值、最小值信息起到过滤做用的示意图:

原厂解读:达梦数据库列存储技术原理与实现(有彩蛋)

除了最大值、最小值起到跳区扫描减小IO的做用,区和值、区内有效行数等其它信息在一些统计分析场景甚至能够彻底避免数据区的扫描。如MAX,COUNT,AVG等一些函数能够直接经过查询辅助表得到。

3

自适应压缩算法

连续存储的列数据,具备更大的压缩单元和数据类似性,能够得到远优于行存储的压缩效率。根据列存储的特性,达梦提供一套自适应的压缩算法,能够根据数据特性以区为单位自动选择相应的算法最大化压缩率和性能。

下面详细介绍4种编码策略:

(1)字典编码

利用数据类型的一致性,将相同的值提取出来生成符号表,每一个列值则直接存储该值映射成的符号表值id便可。

字典编码的示例以下:

原厂解读:达梦数据库列存储技术原理与实现(有彩蛋)

(2)常量编码

当区内的数据大部分的数据相同,只有少数不一样时,能够采用常量编码。该编码将区内数据出现最多的一个值做为常量值,其余值做为异常值。异常值使用<行号+值>的方式存储。

原厂解读:达梦数据库列存储技术原理与实现(有彩蛋)

(3)RLE编码

当区内的数据存在大量的相同值,每一个不一样值的个数比较均匀,且连续出现时,可使用RLE编码。

原厂解读:达梦数据库列存储技术原理与实现(有彩蛋)

(4)序列编码

当区内的数据差值成等差数列,或者存在必定的代数关系,则可使用序列编码。

原厂解读:达梦数据库列存储技术原理与实现(有彩蛋)

(5)四种编码使用策略

字典编码、常量编码和RLE编码都是基于重复值较多的状况下使用的,若是不一样值中,某个值出现屡次,其余的值都只出现一次,则可使用常量编码;若是这些不一样值都连续出现屡次,且出现的次数至关,则使用RLE编码;若是这些不一样值出现的次数至关,但都不连续,则使用字典编码。从上可知,这三种编码方式都是基于不一样值的分布特征来肯定使用哪一种编码,也就是说,只会使用三种中的一种编码方式,不会嵌套使用。

序列编码基于先后两个数据的差值大部分都相同的一种编码方式,当差值计算出来以后,能够再分析其数据特征肯定再使用前面三种编码方式。

综上所述,这四种编码策略以下:

  1. 若是该列为自增列或序列,则直接使用序列编码;
  2. 得到区数据统计信息:不一样值个数n_dist、每一个不一样值个数、不一样值数据指针、每一个值连续出现的次数、整型数的最大值;
  3. 根据得到的区统计信息,肯定使用常量编码、RLE编码仍是字典编码;这三种编码的使用顺序为:优先使用常量编码,其次使用RLE编码,最后才使用字典编码。
  4. 若是编码后的总长度超过了原始长度,则不编码,直接返回;

除了采用编码进行压缩外还能够对区采用QUICKLZ或1-9级LZ算法进一步压缩,二者能够同时存在,也就是对编码后的存储结构进一步二进制压缩。

经过以上压缩算法,一般能够将数据压缩几倍,若是运气好(数据有序、重复值不少等)压缩率可达数百倍。目前CPU性能发展很快,而存储性能提高有限,特别是大数据处理领域不大可能大规模使用SSD。解压引发的性能损失远远小于磁盘IO等待的开销。

Q&A

Q1:智能索引针对的数据类型和长度有限制吗?

A1:“智能索引”不能用于大字段类型如BLOB,CLOB,其它达梦支持的基本数据类型均可以利用“智能索引”。

Q2:字典压缩算法的字典有大小限制吗?会根据列中数据量变化吗?字典创建在列上仍是区上呢?

A2:区是列的子集,若是数据库采用字典编码去压缩一个区,则这个区维护一个字典,字典会根据数据量变化。好比这个区有1000个不一样值,则字典就有1000个值。有1万个不一样值,则字典就有1万个值。字典编码有大小限制,若是系统判断采用字典压缩算法后,压缩率达不到阀值会放弃采用该编码压缩。

Q3:首先,在HTS目录下建立这个表对应的模式目录。目录名为“SCH+长度为9的ID号”组成的字符串。9位的ID号,是指表的tabid么 ?

A3:SCH+9位ID,那个ID是模式的编码号。

Q4:若是字段值为20000000000000000xxxxxxxx,这种数据类型,智能索引是否还会生效?

A4:会生效,只有数据很乱的时候才不生效。好比全部的区最大值最小值都很相近,好比都是1到10000000000,则没法利用智能索引。

Q5:数据字段中如有大量的空值,请问这种压缩策略能不能有很好的压缩率?如何实现?

A5:在达梦数据库里也是一个特殊字符,在列存里同其它数据处理。也是根据数据的实际状况选择编码方式压缩。通常大量同一个字符,压缩率通常都很好。

Q6:请问下收费规则如何?支持数据仓库吗?对经典的多对多关系怎么拆分?

A6:数据库的收费规则得咨询销售,不过确定比Oracle便宜。数据仓库能够基于咱们构建,你说的多对多关系拆分能够线下讨论。

Q7:和Oracle兼容性如何?

A7:达梦在DML类语句上,100%兼容Oracle语法。PL/SQL大部分都兼容。若是DML语句发现有不兼容的地方告诉咱们,咱们立马改了。PL/SQL不兼容的看状况,对于经常使用的语法和Oracle是兼容的,很冷门的包若是没有项目推进,通常不会主动去兼容。

Q8:达梦是基于开源数据库改的么?

A8:彻底自主开发、自主原创,源代码都是咱们本身写的。

做者介绍 李鹏

    • 现任职于达梦数据库,从事数据库测试和技术职称工做;
    • 擅长数据库性能瓶颈分析定位及调优,主要负责数据库产品性能测试及重点项目竞争性测试;
    • 曾参与国电电网、南方电网、国家工商总局等项目的POC测试,积累了丰富的数据库测试经验。

    

http://www.58maisui.com/2016/06/17/a-218/

相关文章
相关标签/搜索