技术开发 频道

DB2 V9表压缩


对已经存在的表使用数据行压缩(表压缩)

    下面我看一下如何对一个已经存在的表(表中有数据存在)启用数据行压缩(表压缩),首先我们需要创建一个示例表 TEST2,并插入部分数据。接下来发出ALTER TABLE命令对示例表TEST2指定COMPRESS属性,运行脱机重组命令,给示例表TEST2创建压缩字典并压缩数据。 

    在DB2CLP窗口中,连上示例数据库DB2TEST1,发出CREATE TABLE命令,创建示例表TEST2,初始不使用表压缩功能(不指定COMPRESS关键字),具体如清单18所示:
- - 清单18 .创建示例表TEST2 C:\> db2 connect to db2test1 数据库连接信息 数据库服务器 = DB2 / NT 9.1.0 SQL 授权标识 = RHETTE 本地数据库别名 = DB2TEST1 C:\> DB2 CREATE TABLE TEST2 ( ID INTEGER , NAME VARCHAR ( 10 ) , DEPARID VARCHAR ( 10 ) , NOTE VARCHAR ( 100 ) ) IN TABLESPACE1 DB20000I SQL命令成功完成。

    命令执行成功,这样我们就创建了示例表TEST2,其不使用表压缩功能,接下来我们对示例表TEST2插入数据,部门编号都是‘001’,备注信息都是‘TEST’,编号和姓名都不相同,具体如清单19所示:

- - 清单19 .对示例表TEST2插入部分数据 C:\> DB2 INSERT INTO TEST2( ID , NAME , DEPARID , NOTE ) VALUES ( 1 , ' AA ' , ' 001 ' , ' TEST ') DB20000I SQL命令成功完成。 C:\> DB2 INSERT INTO TEST2( ID , NAME , DEPARID , NOTE ) VALUES ( 2 , ' BB ' , ' 001 ' , ' TEST ') DB20000I SQL命令成功完成。 C:\> DB2 INSERT INTO TEST2( ID , NAME , DEPARID , NOTE ) VALUES ( 3 , ' CC ' , ' 001 ' , ' TEST ') DB20000I SQL命令成功完成。 C:\> DB2 INSERT INTO TEST2( ID , NAME , DEPARID , NOTE ) VALUES ( 4 , ' DD ' , ' 001 ' , ' TEST ') DB20000I SQL命令成功完成。 C:\> DB2 INSERT INTO TEST2( ID , NAME , DEPARID , NOTE ) VALUES ( 5 , ' EE ' , ' 001 ' , ' TEST ') DB20000I SQL命令成功完成。 C:\> DB2 INSERT INTO TEST2( ID , NAME , DEPARID , NOTE ) VALUES ( 6 , ' FF ' , ' 001 ' , ' TEST ') DB20000I SQL命令成功完成。 C:\> DB2 INSERT INTO TEST2( ID , NAME , DEPARID , NOTE ) VALUES ( 7 , ' GG ' , ' 001 ' , ' TEST ') DB20000I SQL命令成功完成。 C:\> DB2 INSERT INTO TEST2( ID , NAME , DEPARID , NOTE ) VALUES ( 8 , ' HH ' , ' 001 ' , ' TEST ') DB20000I SQL命令成功完成。 C:\> DB2 INSERT INTO TEST2( ID , NAME , DEPARID , NOTE ) VALUES ( 9 , ' II ' , ' 001 ' , ' TEST ') DB20000I SQL命令成功完成。


    命令成功完成,这样我们为示例表TEST2插入了9条记录。部门编号都是‘001’,备注信息都是‘TEST’,编号和姓名都不相同。 
    如果想对示例表TEST2启用表压缩功能,需要把表的COMPRESS选项改成YES。下面我们在DB2CLP窗口中,发出ALTER TABLE命令,把示例表TEST2的COMPRESS属性设置为YES,具体如清单20所示:

- - 清单20 .对示例表TEST2启用COMPRESS属性 C:\> db2 alter table test2 compress yes DB20000I SQL命令成功完成。


    命令成功完成,此时示例表TEST2启用了表压缩功能,但是由于没有压缩字典的存在,所以示例表TEST2中的数据还不是以压缩的方式存储的。直到显式的发出了脱机REORG命令,创建了压缩字典后,示例表TEST2中的数据才会真正的压缩存储。 

    下面我们对示例表TEST2创建一个压缩字典,由于是第一次构建压缩字典,所以需要执行带RESETDICTIONARY选项的REORG命令。 

    在DB2CLP窗口中,对示例表TEST2发出REORG命令,执行脱机重组,为示例表TEST2构建压缩字典,具体如清单21所示:

- - 清单21 .对示例表TEST2创建压缩字典 C:\> db2 REORG TABLE test2 resetdictionary DB20000I REORG命令成功完成。

    命令成功完成,这个命令将扫描整个表,创建压缩字典,然后执行实际表的重组,并在重组的过程中压缩数据。由于部门编号和备注信息各行的数据都相同,所以将DB2通过分析与获取数据中出现的重复模式,生成压缩字典。 
    如果想查看对示例表TEST2使用表压缩(数据行压缩)比不使用表压缩节省了多少空间,可以通过INSPECT ROWCOMPESTIMATE语句进行评估分析,也可以查看系统表SYSIBM.SYSTABLES查看实际的压缩效果,具体如前面所述。
下面我们来总结一下表压缩的相关内容。 

    如果想对一个新表启用表压缩,可以按照以下步骤:
 -创建一个表,将表的COMPRESS属性设置为 YES
 -对表装入一部分数据
 -执行带有RESETDICTIONARY选项的脱机重组,创建一个新的压缩字典
 -装入剩余的数据到这个表中(装入时将考虑压缩字典并在装入时压缩数据) 

    如果想对一个已经存在的表(表中已经有数据)启用表压缩,可以按照以下步骤:
 -通过ALTER TABLE命令将表的COMPRESS属性设置为 YES
- 执行带有RESETDICTIONARY选项的脱机重组,创建一个新的压缩字典 

    如果想查看对表使用表压缩(数据行压缩)比不使用表压缩节省了多少空间,可以通过INSPECT ROWCOMPESTIMATE语句进行评估分析。带压缩估计选项(ROWCOMPESTIMATE)的INSPECT命令,将生成一份报告,描述节省了多少页。语法如下:

DB2 INSPECT ROWCOMPESTIMATE TABLE NAME table_name RESULTS KEEP file_name 

    由于INSPECT命令生成的文件是二进制的,无法直接查看,所以我们需要使用DB2INSPF命令将此文件格式转成可读模式才能查看,具体语法如下:

DB2INSPF file_name output_file_name 

    数据行压缩是基于字典的压缩,每个字典是一个压缩/解压缩数据记录的符号表。算法是基于LEMPEL-ZIV(LZ)算法,使用静态字典,每张表一个字典,存放在永久表对象中。使用数据行压缩的数据无论是在磁盘还是在内存都是压缩的,只有在计算前才会被解压缩,因此极大地节约了I/O带宽和内存,但是增加了CPU消耗。对于压缩的数据行其日志也是压缩的。对于经压缩后不能节省存储的行,DB2不对其进行压缩处理,数据(每一行)中重复的串是高压缩比的关键。文本数据一般压缩得比较好,因为其中往往包括重复字串以及大量的重复字符、前导或后缀空格。 

    需要注意的是,通过执行CREATE TABLE或ALTER TABLE语句打开表压缩开关时,并不压缩数据,数据仅在创建压缩字典表后才能真正实现压缩。压缩字典表将在临时内存中创建,大约需临时占用10M左右内存,临时内存从UTILITIES HEAP中申请。字典的分析与生成基于表中已有的数据,是离线进行的,在以后的版本中将会支持在线进行,也就是说现在只能是在脱机重组时创建压缩字典,在将来的版本中将支持联机重组时创建压缩字典。 

    需要注意的是,执行脱机重组(REORG)的时候,有两个重要的选项,分别是RESETDICTIONARY和KEEPDICTIONARY,两个含义和动作都是不一样的。我们来分别来看一下:

0
相关文章