欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

DB2 10新特性: 自适应压缩

程序员文章站 2024-04-04 14:44:23
...

在刚刚发布的 DB2 LUW 10.1 中,引入了一种新的压缩技术——自适应压缩。这种压缩方案,是表压缩和页压缩的混合体,即用户的数据表在被表级字典压缩之后,还会被数据页一级的字典压缩。

该方案继承了原有表压缩高压缩率的优点,同时利用动态的页级字典,在提高压缩率的同时,有效缓解了原有表压缩静态字典导致压缩率随数据变化衰减的问题

DB2 中的表压缩

在数据大爆炸的时代背景下,数据压缩的作用显得越发重要。压缩一方面可以节省数据存储成本,另一方面可以提高数据的访问效率。通常来说,压缩是基于数据字典的。字典中记录了数据中重复出现的、较长的模式和用来表示这些模式的、较短的符号。压缩的过程就是将原始数据中的模式替换成符号,而解压就是将压缩后数据中的符号替换成原先的模式,从而还原出原始数据。

从 V9.1 开始,DB2 Linux Windows Unix 提供了对用户表数据的行压缩(Row Compression)支持,这一压缩技术也称为深度压缩(Deep Compression)。行压缩是针对先前已有的值压缩技术提出的。值压缩是将表不同行、同一列的重复数据只保存一份,其他地方仅是此处的引用而已。行压缩则是以行为数据压缩的基本单位,在压缩过程中,行不会被拆为列来进行处理。通过该技术,用户能够为数据表建立一个表级别的数据字典,并使用该字典来压缩整个表中的全部数据。在对一个表启用了压缩之后,需要用户执行表重组在已有数据上建立字典,并压缩已有数据。在向一个已经启用了压缩、并且创建了字典的表中插入数据时,新数据会被压缩;修改该表中的数据时,数据会被解压,修改后再存入表中;查询表中的数据时,数据会被解压之后返回给用户。如果表中的数据在建立字典之后发生剧烈变化,原先的字典就有可能不能很好的压缩变化之后的数据,这时候可以使用带有重置字典选项的表重组命令来重新创建表压缩字典(REORG TABLE … RESETDICTIONARY)并用新字典压缩已有数据。

在 DB2 V9.1 中,表重组是创建字典的唯一方式,但是表重组的开销较大,使用较为不便。通常的做法是,将一小部分数据导入表中,在此之上进行表重组建立字典,然后再进入表中的数据就会被压缩了。在 V9.5 中自动化了这一过程,增加了自动字典建立(ADC,Automatic Dictionary Creation)特性。在启用了行压缩之后,压缩字典会在表中的数据增加到一定数量之后(默认是 2M)自动创建,随后进入表中的数据就会被该字典压缩。自动字典建立简化了行压缩的使用,使得用户不再需要手工运行表重组来创建字典并压缩数据,字典会在数据进入表示自动建立,在有了字典之后的数据也会自动被压缩,这一过程无需用户干预。

但是,与表重组建立的字典和压缩的数据相比,ADC 创建的字典仅基于很少的一部分数据,因而相对使用离线表重组建立压缩字典而言,ADC 的压缩率较低。如果用户想要得到较高的压缩率,带有重置字典选项的表重组操作还是必要的。

值得注意的是,一个用户表的每个分区下的每个数据分区都有自己的表压缩字典。分区,指的是数据库分区(Database Partition Feature,DPF)环境下的数据库分区;数据分区,指的是范围分区表(Range Partition Table)的数据分区。这两种特性下表中的数据都是物理独立存放的,因此它们都会有自己独立的表压缩字典。本文所提及的表级字典,如果没有特殊说明,均指的是单一数据库分区、非数据分区表中的表级字典。

以上简单介绍了 DB2 V9.7 中已有的表压缩特性,以及如何使用该特性建立字典并压缩表中的数据。以表重组建立字典并压缩数据为例,字典基于创建字典时表中数据而建立,所以该字典能够代表此时表中的数据特征。然而,随着表中的数据发生变化,比如新数据的插入,原有数据的更新,原数据的冗余特征就可能发生变化,而表压缩的字典并不能自动根据这些变化动态发生变化,因此,在数据发生变化时,有时表压缩的压缩率会随着数据变化而衰减。为了缓解这一问题,在最新的 DB2 LUW V10.1 中,引入了压缩新特性——自适应压缩(Adaptive Compression)。

自适应压缩

刚才已经提到,表压缩的字典是静态的,即字典在创建之后不会随着数据的变化而发生变化,唯一能够使字典发生变化的操作就是字典的重建——运行带有重置字典选项的离线表重组操作;同时,表压缩的字典对于整个表来说是全局的(暂不考虑数据库分区特性 Database Partition Feature DPF 下的表,以及范围分区表 Range Partition Table),即字典中的模式是从整个表中采样出来的,从而能够代表整个表的数据特征,因此在字典创建时,能够把全表的数据都压缩得较好。

同时,由于表压缩的字典是静态的,表中的数据在字典创建后发生变化时,字典并不会发生变化,从而使得表压缩的压缩率可能会随着数据的变化而降低;由于表压缩的字典是全局的,代表整个表的数据特征,有可能不能代表该表的某些局部特征,比如,一张表的某几处相邻若干条数据相似度非常高,由于这些冗余仅仅是局部的,并不能代表整张表的数据特征,因此表压缩的字典并不能很好的反映这些冗余,这些数据可能就未能达到最佳的压缩效果。

针对这两个问题,自适应压缩应运而生了。自适应压缩在原有的表压缩基础上,叠加了数据页级别的压缩。自适应压缩的解决方案,是传统表压缩和新的页压缩的组合。页压缩是动态的,在页中的数据达到一定程度时,页字典会自动被建立,并且已有数据会被自动压缩,在页中的数据发生变化后,压缩率衰减到一定程度时,页字典会自动被重建;页压缩的是局部的,它只针对其所在页的数据,因此对于聚簇数据(Clustered Data)压缩效果更好。

页压缩技术也是行压缩的一种,即行是压缩的基本单位,压缩过程中不会将行拆分为列来进行处理。为了区别 V9.1 引入的的表级行压缩技术,本文将其称为表压缩,而将 V10.1 中自适应压缩中的页级行压缩称为页压缩。自适应压缩是二者的组合。

跟操作系统中页的概念类似,DB2 中的数据页是 I/O 的最小单位。用户的数据以及一些系统控制信息都以记录(Record)的形式存放在数据页中。DB2 中数据页的大小是可以定义的,默认是 4KB,除此之外,还有 8KB、16KB 和 32KB。页压缩针对的是同一数据页中的数据,页压缩的字典则是以系统内部记录的形式存放在数据页中的。不同数据页中由于数据不同,因而页压缩字典也不同。

在 DB2 LUW V10.1 中,针对自适应压缩在表定义的 SQL 语句中引入了一个新关键字—— ADAPTIVE,语法如清单 1 所示:

清单 1. 新关键字 ADAPTIVE 的语法

				
      .-COMPRESS NO---------------. 
 >-----+---------------------------+-- 
      |              .-ADAPTIVE-. | 
      '-COMPRESS YES-+----------+-'
                     '-STATIC---'

ADAPTIVE 代表对表启用新的自适应压缩方案,而 STATIC 关键字则代表原有的表压缩方案。在没有指定 ADAPTIVE 关键字时,默认启用自适应压缩,即表压缩加页压缩的组合压缩方案,也就是说,指定压缩选项时不指定压缩类型是 ADAPTIVE 还是 STATIC,此时会隐式采用自适应压缩。如果要只使用原先的表压缩,需要显示指定 STATIC 关键字。