vike681 发表于 2016-11-14 04:17:24

db2 data compression feature testing

参照: http://www.ibm.com/developerworks/cn/data/library/techarticles/dm-0902yanbo1/ and http://www.ibm.com/developerworks/data/library/techarticle/dm-0605ahuja/index.html
实际上DB2表压缩的方法是通过查看整个表,找到重复的字符和字符串后,将那些字符和字符串存储在一个压缩字典中,然后用一个存储在字典中对应数据字符串的替代符号来替代表中的实际数据,从而达到了压缩数据的目的。一个压缩属性的表,肯定有他所对应的压缩字典。
实际上DB2表压缩的方法是通过查看整个表,找到重复的字符和字符串后,将那些字符和字符串存储在一个压缩字典中,然后用一个存储在字典中对应数据字符串的替代符号来替代表中的实际数据,从而达到了压缩数据的目的。一个压缩属性的表,肯定有他所对应的压缩字典。
评估压缩率
在压缩表数据之前,你可以使用 INSPECT ROWCOMPESTIMATE 实用工具来对每个候选表评估节约存储的好处。当你运行这个实用工具并且只希望评估而并不真正创建压缩字典,这张表不该被允许压缩。也就是说,这张表应该已经在创建时设置或之后更改为COMPRESS NO(这是创建表时的默认值)。在运行 INSPECT 实用工具之前,表中必须有数据。如果表已经启用了压缩功能,那么运行 INSPECT ROWCOMPESTIMATE实用工具完成已评估的存储节约并建立一个放置在表中的压缩字典。
对于还没有启用压缩的表,运行 INSPECT 实用工具来评估的压缩率。
DB2 INSPECT ROWCOMPESTIMATE TABLE NAME table_name RESULTS KEEP file_name
然后运行命令:
db2inspf file_name output_file_name
这个命令转换检查结果的二进制输出文件到一个叫 output_file_name 的可读的文本文件。这个文件包含使用行压缩页面节约的百分比的评估结果。
如果你使用一个现有表,DB2 9.5 产品有一个方法使用管理函数来评估压缩节约。为了在一个没有压缩过的现有表上判断行压缩的好处,又可以使用这个 SQL 语句:
SELECT * FROM TABLE
(SYSPROC.ADMIN_GET_TAB_COMPRESS_INFO('schema', 'table_name', 'mode')) AS T

在这个 SQL 语句中,模式可以是 REPORT 或 ESTIMATE 。
使用 REPORT,你可以查看在创建压缩字典时的信息。如果表没有压缩字典,这个模式将不可用。这些信息也包括压缩节约的页面数目、什么时候创建压缩字典、用什么方法来创建压缩字典、平均行压缩率以及其他的信息。
使用 ESTIMATE 同样可以提供 REPORT 模式提供的信息,不过如果你继续进行行压缩,这张表中的数据也被抽样以了解有多少数据将被压缩。由于数据会被添加和更改,使用 RUNSTATS 和 ESTIMATE 模式是评估压缩影响的好办法。
可以对当前模式中的特定表的 ESTMATE 模式使用 SQL 管理函数 ADMIN_GET_TAB_COMPRESS_INFO 。 通过指定,你可以缩短在表上收集信息所需要的时间并限制使用的系统资源。如果你在运行 SQL 语句的时候没有包含‘表名’,那么将对这个模式下面的所有的表都进行压缩评估。如果你同时省略了模式和‘表名’,你将得到对整个数据库中的所有表的压缩评估。
这个 SQL 语句是用来判断压缩哪张表的好方法。你可以在某个特定模式下的所有表中选择表名以及节约页面的百分比。然后对节约页面的百分比用 ORDER BY 子句来找出从压缩中受益最多的表。如果你把这各表函数和 SYSCAT.TABLES 编目表进行连接,然后用增加的‘ npages ’值乘这张表所在的表空间的 PAGESIZE,再乘节约的百分比,最后你就可以计算出使用压缩节约出来的 gigabytes 数。你应该也看到了表的存储将会从压缩中得到最大的节约。
压缩使用表重组
一旦你决定了要压缩某个现有表,一个方法是对表启用压缩然后使用表重组命令来建立压缩字典。 当一个压缩字典建立好以后,及那个从实用程序堆中分配一个 10MB 在临时缓存里的空间,用于保存这个运算法则用于创建压缩字典的样本数据。
在重组、创建压缩字典时数据压缩也同时完成,这个过程中表处于离线状态。
表中的所有数据行都可以成为创建压缩字典的样本。在压缩之前,表的现有数据应该可以代表将在之后整个生命周期中插入的所有数据。
REORG TABLE 命令中添加了两个新的关键字,以使创建压缩字典变得更加容易了。默认关键字 KEPPDICTIONARY 用于检查用于判断这张表中是否已经有一个字典存在。如果压缩字典已经存在,它将在重组数据的时候被使用。如果不存在一个字典,就创建一个。如果没有字典存在,RESETDICTIONARY 关键字是指示创建一个新的压缩字典,如果有一个就覆盖它。
一旦表启用了压缩并通过重组表创来建了压缩字典,这张表中所有的数据都会被压缩而且从现在开始所有插入的数据也都将被压缩。
开启表的压缩功能(GEH_ADMIN是db2 schema, EXCEPTION_MESSAGE是表名):
(db2)CREATE TABLE EXCEPTION_MESSAGE . . . COMPRESS YES
or
(db2)ALTER TABLE EXCEPTION_MESSAGE COMPRESS YES

扫描表并创建对应的压缩字典,并执行实际的表重组,从而压缩数据(每个表都有自己的压缩字典,新插入的数据也会继续被压缩):
(db2)REORG TABLE EXCEPTION_MESSAGE resetdictionary(Maybe it will take a long time if there is large records in database)

对于压缩后的表,如果想进行一次表重组,而不是重建数据字典,那么:
(db2)REORG TABLE EXCEPTION_MESSAGE keepdictionary

DB2 9.5 产品有一个方法使用管理函数来评估压缩节约。为了在一个没有压缩过的现有表上判断行压缩的好处,又可以使用这个 SQL 语句:
SELECT * FROM TABLE (SYSPROC.ADMIN_GET_TAB_COMPRESS_INFO('GEH_ADMIN', 'EXCEPTION_MESSAGE', 'ESTIMATE')) as MONITOR_COMPRESSION_INFO
在这个 SQL 语句中,模式可以是 REPORT 或 ESTIMATE 。
使用 REPORT,你可以查看在创建压缩字典时的信息。如果表没有压缩字典,这个模式将不可用。这些信息也包括压缩节约的页面数目、什么时候创建压缩字典、用什么方法来创建压缩字典、平均行压缩率以及其他的信息。
使用 ESTIMATE 同样可以提供 REPORT 模式提供的信息,不过如果你继续进行行压缩,这张表中的数据也被抽样以了解有多少数据将被压缩。由于数据会被添加和更改,使用 RUNSTATS 和 ESTIMATE 模式是评估压缩影响的好办法。
可以对当前模式中的特定表的 ESTMATE 模式使用 SQL 管理函数 ADMIN_GET_TAB_COMPRESS_INFO 。 通过指定,你可以缩短在表上收集信息所需要的时间并限制使用的系统资源。如果你在运行 SQL 语句的时候没有包含‘表名’,那么将对这个模式下面的所有的表都进行压缩评估。如果你同时省略了模式和‘表名’,你将得到对整个数据库中的所有表的压缩评估。
这个 SQL 语句是用来判断压缩哪张表的好方法。你可以在某个特定模式下的所有表中选择表名以及节约页面的百分比。然后对节约页面的百分比用 ORDER BY 子句来找出从压缩中受益最多的表。如果你把这各表函数和 SYSCAT.TABLES 编目表进行连接,然后用增加的‘ npages ’值乘这张表所在的表空间的 PAGESIZE,再乘节约的百分比,最后你就可以计算出使用压缩节约出来的 gigabytes 数。你应该也看到了表的存储将会从压缩中得到最大的节约。
在压缩后,我们通常想知道表压缩后能节省多少空间,可以利用RUNSTATS命令来实现:
DB2 RUNSTATS ON TABLE GEH_ADMIN.EXCEPTION_MESSAGE
DB2 SELECT NAME , COMPRESSION , AVGROWSIZE , PCTPAGESSAVED , PCTROWSCOMPRESSED ,AVGROWCOMPRESSIONRATIO , AVGCOMPRESSEDROWSIZE FROM SYSIBM.SYSTABLES WHERE NAME = 'EXCEPTION_MESSAGE'

如果想查看压缩字典的大小,可以使用ADMIN_GET_TAB_INFO表函数查看其DICTIONARY_SIZE列的值,比如我们想查看示例表TEST1的压缩字典大小,可以在DB2CLP窗口中这么查看
db2 describe "select * from table(sysproc.admin_get_tab_info('GEH_ADMIN','EXCEPTION_MESSAGE')) as t"


我们现在想对示例表TEST1进行解压缩,可以继续在当前的DB2CLP窗口中,先发出ALTER TABLE命令,把示例表TEST1的COMPRESS属性设置为NO,再运行REORG命令执行脱机重组。命令成功完成,此时示例表EXCEPTION_MESSAGE将不再使用表压缩功能,并且压缩字典将被删除。
db2 alter table EXCEPTION_MESSAGE compress no
db2 reorg table EXCEPTION_MESSAGE resetdictionary

export TO c:\export_data\myfile.del OF DEL LOBS TO c:\export_data\lob1, c:\export_data\lob2, c:\export_data\lob3 MODIFIED BY codepage=1208 LOBSINFILE chardel{ coldel} MESSAGES c:\export_data\export.txt SELECT * FROM EXCEPTION_MESSAGE

import from c:\export_data\myfile.del of DEL LOBS FROM c:\export_data\lob1, c:\export_data\lob2, c:\export_data\lob3 MODIFIED BY codepage=1208 LOBSINFILE chardel{ coldel} COMMITCOUNT 100 MESSAGES c:\export_data\import.txt insert into TEST_EXCEPTION_MESSAGE

The below is how to do the data row compression.(Note: “GEH_ADMIN” is the tables’ schema, “EXCEPTION_MESSAGE” is the table name).
(1). Change table to a compression table   
DB2 ALTER TABLE EXCEPTION_MESSAGE COMPRESS YES
(2). Create the table dictionary. The compression takes effect only once the table dictionary is built. Maybe it will take a long time if there are large records in database
DB2 REORG TABLE EXCEPTION_MESSAGE resetdictionary
(3). If the table dictionary has been built, so you should ignore above (2) step, and use the below sentence
DB2 REORG TABLE EXCEPTION_MESSAGE keepdictionary
(4). Using RUNSTATS command to get the real compression ratio when you have done the data row compression:
DB2 RUNSTATS ON TABLE GEH_ADMIN.EXCEPTION_MESSAGE
DB2 SELECT NAME, COMPRESSION, AVGROWSIZE, PCTPAGESSAVED, PCTROWSCOMPRESSED, AVGROWCOMPRESSIONRATIO, AVGCOMPRESSEDROWSIZE FROM SYSIBM.SYSTABLES WHERE NAME = 'EXCEPTION_MESSAGE'
(5). Removing the data row compression for any table if you want
DB2 alter table EXCEPTION_MESSAGE compress no
DB2 reorg table EXCEPTION_MESSAGE resetdictionary
(6). Estimating which uncompressed table is better to use data row compression
DB2 SELECT * FROM TABLE (SYSPROC.ADMIN_GET_TAB_COMPRESS_INFO ('GEH_ADMIN', '', 'ESTIMATE')) as MONITOR_COMPRESSION_INFO


转载http://space.itpub.net/9524210/viewspace-496180:
对新表使用数据行压缩(表压缩):
数据行压缩的目标是节省磁盘存储空间。它还可以减少磁盘I/O。另外,可以在缓冲池中高速缓存更多数据,这样就可以提高缓冲池命中率。但是,关联的成本以压缩和解压缩数据所需的额外CPU周期形式出现。数据行压缩节省的存储量和对性能的影响与数据库中数据的特征、数据库的布局和调整以及应用程序工作负载相关。仅压缩数据页上的数据或日志记录中的数据。数据行压缩使用基于静态字典的压缩算法来逐行压缩数据。在行级别压缩数据允许将一行中跨多个列值的重复模式替换为较短的符号字符串。为了压缩表数据,表COMPRESS属性必须设置为YES,且该表必须有压缩字典。要把表设置成压缩方式,使用下列两个命令之一:
CREATE TABLE table_name . . . COMPRESS YES
OR
ALTER TABLE tablename COMPRESS YES
我们接下来创建示例表TEST1,表数据将存储在表空间TABLESPACE1中,其将启用表压缩功能(数据行压缩)。在DB2CLP窗口中,连上示例数据库DB2TEST1,发出CREATE TABLE命令创建带COMPRESS属性的示例表TEST1,具体如清单5所示:
- - 清单5 .创建示例表TEST1
C:\> DB2 CREATE TABLE TEST1 ( ID INTEGER , NAME VARCHAR ( 10 ) , DEPARID VARCHAR ( 10 ) , NOTE VARCHAR ( 100 ) ) IN TABLESPACE1 COMPRESS YES
DB20000ISQL命令成功完成。
命令执行成功,这样我们就创建了示例表TEST1,其启用了数据行压缩方式。要使压缩生效,我们需要要构建压缩字典并接着压缩表(表中需要有数据,不能是空表),然后DB2将扫描表中的数据,找出相同的字符串替换为较短的符号字符串,并放入到压缩字典中。表中的所有数据行都将参与构建压缩字典。该字典将与表数据行一起存储在表数据对象部分。为了构建压缩字典,我们可以使用REORG命令,执行脱机重组。第一次压缩一个表(或者你需要重新构建压缩字典)你可以使用如下命令:
REORG table table_name resetdictionary
这个命令将扫描整个表,创建压缩字典,然后执行实际表的重组,并在重组的过程中压缩数据。需要注意此时REORG使用的是RESETDICTIONARY选项。如果表的COMPRESS属性为YES并且字典存在,则可能会压缩插入到页中的数据行。此情况适用于任何插入行操作,包括通过导入或装入操作来插入。压缩是对整个表启用的,但却是单独地压缩每行。因此,一个表可以同时包含已压缩的行和未压缩的行。以后如果你需要运行一个正常的表重组,但是有不希望重新构建压缩字典,可以运行下面的命令:
REORG table table_name keepdictionary
需要注意此时REORG使用的是KEEPDICTIONARY选项。每个表都拥有自己的压缩字典。只能压缩永久数据对象。数据行压缩不适用于索引、长整型数据对象、LOB 数据对象和XML数据对象。行压缩与表数据复制支持不兼容。
下面我们将为清单5中创建的示例表TEST1创建一个压缩字典。
在 DB2CLP窗口中,发出REORG命令,脱机执行表重组命令。当示例表TEST1是空表时,执行REORG命令时会报SQL2220W错误,构建压缩字典失败,这是因为示例表TEST1中需要有部分数据时创建压缩字典才会成功,否则压缩字典将无法构建。具体如清单6所示:
- - 清单6 .对示例表TEST1创建压缩字典
C:\> db2 REORG TABLE test1resetdictionary
SQL2220W 没有为一个或多个数据对象构建压缩字典。
C:\> db2 ?sql2220w
SQL2220W 没有为一个或多个数据对象构建压缩字典。
解释:
未能为一个或多个数据对象构建压缩字典。这些对象不包含任何记录,或者不包含大于适合于此页大小的最小记录长度的任何记录。未构建新字典。将继续完成该操作。如果在执行该操作之前已经有一个字典,则会保留该字典,而行数将取决于压缩程度。
用户响应:
参阅“管理日志”以确保是那些数据对象导致了警告。
为了构建压缩字典,我们需要先为示例表TEST1插入部分数据。
在DB2CLP窗口中,连上示例数据库DB2TEST1,在示例表TEST1插入部分数据,部门编号都是‘001’,备注信息都是‘TEST’,编号和姓名都不相同,具体如清单7所示:
- - 清单7 .对示例表TEST1插入部分数据
C:\> DB2 INSERT INTO TEST1( ID , NAME , DEPARID , NOTE ) VALUES ( 1 , ' AA ' , '001 ', 'TEST ')
DB20000ISQL命令成功完成。
C:\> DB2 INSERT INTO TEST1( ID , NAME , DEPARID , NOTE ) VALUES ( 2 , ' BB ' , '001 ', 'TEST ')
DB20000ISQL命令成功完成。
C:\> DB2 INSERT INTO TEST1( ID , NAME , DEPARID , NOTE ) VALUES ( 3 , ' CC ' , '001 ', 'TEST ')
DB20000ISQL命令成功完成。
C:\> DB2 INSERT INTO TEST1( ID , NAME , DEPARID , NOTE ) VALUES ( 4 , ' DD ' , '001 ', 'TEST ')
DB20000ISQL命令成功完成。
C:\> DB2 INSERT INTO TEST1( ID , NAME , DEPARID , NOTE ) VALUES ( 5 , ' EE ' , '001 ', 'TEST ')
DB20000ISQL命令成功完成。
C:\> DB2 INSERT INTO TEST1( ID , NAME , DEPARID , NOTE ) VALUES ( 6 , ' FF ' , '001 ', 'TEST ')
DB20000ISQL命令成功完成。
C:\> DB2 INSERT INTO TEST1( ID , NAME , DEPARID , NOTE ) VALUES ( 7 , ' GG ' , '001 ', 'TEST ')
DB20000ISQL命令成功完成。
C:\> DB2 INSERT INTO TEST1( ID , NAME , DEPARID , NOTE ) VALUES ( 8 , ' HH ' , '001 ', 'TEST ')
DB20000ISQL命令成功完成。
C:\> DB2 INSERT INTO TEST1( ID , NAME , DEPARID , NOTE ) VALUES ( 9 , ' II ' , '001 ', 'TEST ')
DB20000ISQL命令成功完成。
命令成功完成,这样我们为示例表TEST1插入了9条记录。部门编号都是‘001’,备注信息都是‘TEST’,编号和姓名都不相同。
下面我们对示例表TEST1创建一个压缩字典,由于是第一次构建压缩字典,所以需要执行带RESETDICTIONARY选项的REORG命令。
在DB2CLP窗口中,对示例表TEST1发出REORG命令,执行脱机重组,为示例表TEST1构建压缩字典,具体如清单8所示:
- - 清单8 .对示例表TEST1创建压缩字典
C:\> db2 REORG TABLE test1resetdictionary
DB20000IREORG命令成功完成。
命令成功完成,这个命令将扫描整个表,创建压缩字典,然后执行实际表的重组,并在重组的过程中压缩数据。由于部门编号和备注信息各行的数据都相同,所以将DB2通过分析与获取数据中出现的重复模式,生成压缩字典。
接下来我们继续对示例表TEST1插入数据,由于示例表TEST1的COMPRESS属性为YES并且字典存在,所以可能会压缩插入到页中的数据行。此情况适用于任何插入行操作,包括通过导入或装入操作来插入。
在DB2CLP窗口中,对示例表TEST1通过INSERT INTO命令插入剩余10条数据,具体如清单9所示:
- - 清单9 .对示例表TEST1插入数据
C:\> DB2 INSERT INTO TEST1( ID , NAME , DEPARID , NOTE ) VALUES ( 10 , ' JJ ' , '001 ', 'TEST ')
DB20000ISQL命令成功完成。
C:\> DB2 INSERT INTO TEST1( ID , NAME , DEPARID , NOTE ) VALUES ( 11 , ' KK ' , '001 ', 'TEST ')
DB20000ISQL命令成功完成。
C:\> DB2 INSERT INTO TEST1( ID , NAME , DEPARID , NOTE ) VALUES ( 12 , ' LL ' , '001 ', 'TEST ')
DB20000ISQL命令成功完成。
C:\> DB2 INSERT INTO TEST1( ID , NAME , DEPARID , NOTE ) VALUES ( 13 , ' MM ' , '001 ', 'TEST ')
DB20000ISQL命令成功完成。
C:\> DB2 INSERT INTO TEST1( ID , NAME , DEPARID , NOTE ) VALUES ( 14 , ' NN ' , '001 ', 'TEST ')
DB20000ISQL命令成功完成。
C:\> DB2 INSERT INTO TEST1( ID , NAME , DEPARID , NOTE ) VALUES ( 15 , ' OO ' , '001 ', 'TEST ')
DB20000ISQL命令成功完成。
C:\> DB2 INSERT INTO TEST1( ID , NAME , DEPARID , NOTE ) VALUES ( 16 , ' PP ' , '001 ', 'TEST ')
DB20000ISQL命令成功完成。
C:\> DB2 INSERT INTO TEST1( ID , NAME , DEPARID , NOTE ) VALUES ( 17 , ' QQ ' , '001 ', 'TEST ')
DB20000ISQL命令成功完成。
C:\> DB2 INSERT INTO TEST1( ID , NAME , DEPARID , NOTE ) VALUES ( 18 , ' RR ' , '001 ', 'TEST ')
DB20000ISQL命令成功完成。
C:\> DB2 INSERT INTO TEST1( ID , NAME , DEPARID , NOTE ) VALUES ( 19 , ' SS ' , '001 ', 'TEST ')
DB20000ISQL命令成功完成。
命令成功完成,新插入的10条记录在数据库中也将以压缩的方式存储。
如果想估计对示例表TEST1使用表压缩(数据行压缩)比不使用表压缩节省了多少空间,可以通过INSPECT ROWCOMPESTIMATE语句进行评估分析。记住,这个命令只是估计压缩的效果,而不是查看最终实际的压缩效果,如果想查看实际的压缩效果,需要查看系统表SYSIBM.SYSTABLES。带压缩估计选项(ROWCOMPESTIMATE)的INSPECT命令,将生成一份报告,描述节省了多少页。语法如下:
DB2 INSPECT ROWCOMPESTIMATE TABLE NAME table_name RESULTS KEEP file_name
由于INSPECT命令生成的文件是二进制的,无法直接查看,所以我们需要使用DB2INSPF命令将此文件格式转成可读模式才能查看,具体语法如下:
DB2INSPF file_nameoutput_file_name
       下面我们看看我们使用表压缩方式节省了多少空间,在DB2CLP窗口中发出DB2 INSPECT命令,具体如清单10所示:
- - 清单10 .查看示例表TEST1,看一下表压缩方式节省了多少空间
C:\> DB2 " INSPECT ROWCOMPESTIMATE TABLE NAME test1 RESULTS KEEPtest1.resp "
DB20000IINSPECT命令成功完成。
       命令成功完成,这样我们就在C:\Program Files\IBM\SQLLIB\DB2下生成了一个文件test1.resp,由于这个文件是二进制的,我们需要使用DB2INSPF将此文件格式转成可读模式才能查看,继续在DB2CLP窗口中执行DB2INSPF命令,具体如清单11所示:
- - 清单11 .查看示例表TEST1,看一下表压缩方式节省了多少空间
C:\> cd C:\Program Files\IBM\SQLLIB\DB2
C:\Program Files\IBM\SQLLIB\DB2> DB2INSPF test1.respoutput_test1.resp
       此时我们打开output_test1.resp文件,可以看到通过压缩而节省的页数所占的百分比是56,通过压缩而节省的字节数所占的百分比是56,由于行大小太小而不适合压缩的行数所占的百分比是0,压缩字典大小是8192个字节,扩充字典大小是3336 个字节,具体如清单12所示:
- - 清单12 .查看示例表TEST1,看一下表压缩方式节省了多少空间
DATABASE: DB2TEST1                                                         
VERSION : SQL09010                                                            
2007-10-25-21.14.03.500000                                          
操作:ROWCOMPESTIMATE TABLE
模式名:RHETTE
表名:TEST1
表空间标识:3对象标识:4
结果文件名:test1.resp
    表阶段开始(有符号的标识:4,无符号的:4;表空间标识:3):RHETTE.TEST1
      数据阶段开始。对象:4 表空间:3
      行压缩估计结果:
      通过压缩而节省的页数所占的百分比:56
      通过压缩而节省的字节数所占的百分比:56
      由于行大小太小而不适合压缩的行数所占的百分比:0
      压缩字典大小:8192 个字节。
      扩充字典大小:3336 个字节。
      数据阶段结束。
    表阶段结束。
处理已完成。2007-10-25-21.14.03.562000
       我们可以使用INSPECT ROWCOMPESTIMATE语句对压缩的效果进行评估分析,如果想查看实际的压缩效果,需要查看系统表SYSIBM.SYSTABLES,这系统表中,有几个新增的列是和压缩相关的:
Ø         COMPRESSION:此参数表示对于表来说,是否使用了压缩,其有4个值,含义分别是:
n         N:没有设置任何压缩
n         V:仅仅设置了空间值压缩
n         R:仅仅设置了数据行压缩
n         B:即设置了空间值压缩,也设置了数据行压缩
Ø         AVGROWSIZE:新增列,用来表示表的平均物理行长,包括所有压缩和没有压缩的数据行,此参数用来决定每页能存放的最大行数(对常规表空间来说,单页最大能放255行,对于大型表空间来说,单页最大行数会超过255行。)。当值为-1的时候,表示统计信息没有收集。
Ø         PCTPAGESSAVED:新增列,表示使用压缩节省空间页的百分比。当值为-1的时候,表示统计信息没有收集。
Ø         PCTROWSCOMPRESSED:新增列,表示表中压缩的行数占总行数的百分比。这个参数用来决定解压缩时CPU的开支。当值为-1的时候,表示统计信息没有收集。
Ø         AVGROWCOMPRESSIONRATIO:新增列,表示所有压缩的行的平均压缩比例(是压缩前的总页数和压缩后的总页数的比例)。当值为-1的时候,表示统计信息没有收集。
Ø         AVGCOMPRSSEDROWSIZE:新增列,表示所有压缩行在物理磁盘上的平均物理行长,当值为-1的时候,表示统计信息没有收集。
另外,需要注意的是,如果想查看SYSIBM.SYSTABLES表中某个表的压缩情况,需要要查询都是表运行RUNSTATS,只有这样,上述几个列的值才不会是-1。
下面,我们在DB2CLP窗口中,发出RUNSTATS命令对示例表TEST1运行统计信息,具体如清单13所示:
- - 清单13 .对示例表TEST1运行统计信息
C:\> DB2 RUNSTATS ON TABLE RHETTE.TEST1
DB20000IRUNSTATS命令成功完成。
    接下来我们就可以通过系统表SYSIBM.SYSTABLES查看示例表TEST1的压缩情况了。
我们继续在DB2CLP窗口中,发出SELECT命令查看示例表TEST1的压缩情况,具体如清单14所示:
- - 清单14 .查看示例表TEST1压缩情况
C:\> DB2 SELECT NAME , COMPRESSION , AVGROWSIZE , PCTPAGESSAVED , PCTROWSCOMPRESSED ,AVGROWCOMPRESSIONRATIO , AVGCOMPRESSEDROWSIZE FROM SYSIBM.SYSTABLES WHERE NAME = 'TEST1'
NAMECOMPRESSIONAVGROWSIZEPCTPAGESSAVEDPCTROWSCOMPRESSED    AVGROWCOMPRESSIONRATIO   AVGCOMPRESSEDROWSIZE      
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -      
TEST1   R         19            56            100                2.29223                      19         
1 条记录已选择。      
    可以看到示例表TEST1启用了数据行压缩,压缩后的所有行的平均行长是19,压缩后节省空间的百分比是56%和用INSPECT命令估计的一样,压缩的行数占总行数的百分比是100%,压缩前和压缩后页数的百分比是2.29223,压缩行的平均行长是19。
    如果想查看压缩字典的大小,可以使用ADMIN_GET_TAB_INFO表函数查看其DICTIONARY_SIZE列的值,比如我们想查看示例表TEST1的压缩字典大小,可以在DB2CLP窗口中这么查看,具体如清单15所示:
- - 清单15 .查看示例表TEST1压缩字典大小
C:\>db2 describe "select * from table(sysproc.admin_get_tab_info('rhette','test1')) as t"
SQLDA 信息
sqldaid : SQLDA   sqldabc: 1204sqln: 27sqld: 27
列信息
sqltype               sqllensqlname.data                  sqlname.length
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
449   VARCHAR            128TABSCHEMA                                    9
449   VARCHAR            128TABNAME                                    7
453   CHARACTER            1TABTYPE                                    7
501   SMALLINT             2DBPARTITIONNUM                              14
497   INTEGER            4DATA_PARTITION_ID                           17
453   CHARACTER            1AVAILABLE                                    9
493   BIGINT               8DATA_OBJECT_L_SIZE                        18
493   BIGINT               8DATA_OBJECT_P_SIZE                        18
493   BIGINT               8INDEX_OBJECT_L_SIZE                         19
493   BIGINT               8INDEX_OBJECT_P_SIZE                         19
493   BIGINT               8LONG_OBJECT_L_SIZE                        18
493   BIGINT               8LONG_OBJECT_P_SIZE                        18
493   BIGINT               8LOB_OBJECT_L_SIZE                           17
493   BIGINT               8LOB_OBJECT_P_SIZE                           17
493   BIGINT               8XML_OBJECT_L_SIZE                           17
493   BIGINT               8XML_OBJECT_P_SIZE                           17
501   SMALLINT             2INDEX_TYPE                                  10
453   CHARACTER            1REORG_PENDING                               13
449   VARCHAR             10INPLACE_REORG_STATUS                        20
449   VARCHAR             12LOAD_STATUS                                 11
453   CHARACTER            1READ_ACCESS_ONLY                            16
453   CHARACTER            1NO_LOAD_RESTART                           15
501   SMALLINT             2NUM_REORG_REC_ALTERS                        20
453   CHARACTER            1INDEXES_REQUIRE_REBUILD                     23
453   CHARACTER            1LARGE_RIDS                                  10
453   CHARACTER            1LARGE_SLOTS                                 11
493   BIGINT            8DICTIONARY_SIZE                      15
如果觉得压缩的效果不能满意,可以对表进行解压缩,也就是把表的COMPRESS 属性设置为 NO,然后执行传统脱机表重组,这样就把压缩表变成了不压缩的表了。
       比如,我们现在想对示例表TEST1进行解压缩,可以继续在当前的DB2CLP窗口中,先发出ALTER TABLE命令,把示例表TEST1的COMPRESS属性设置为NO,再运行REORG命令执行脱机重组,具体如清单16所示:
- - 清单16 .对示例表TEST1进行解压缩
C:\Program Files\IBM\SQLLIB\DB2>cd \
C:\> db2 alter table test1 compress no
DB20000ISQL命令成功完成。
C:\> db2 reorg table test1 resetdictionary
DB20000IREORG命令成功完成。
       命令成功完成,此时示例表TEST1将不再使用表压缩功能,并且压缩字典将被删除。此时我们再次在DB2CLP窗口中查看示例表TEST1的实际压缩情况,可以发现,没有使用压缩,有关压缩的各个列都和压缩的时候值不一样了,具体如清单17所示:
- - 清单17 .查看示例表TEST1压缩情况
C:\> DB2 SELECT NAME , COMPRESSION , AVGROWSIZE , PCTPAGESSAVED , PCTROWSCOMPRESSED ,AVGROWCOMPRESSIONRATIO , AVGCOMPRESSEDROWSIZE FROM SYSIBM.SYSTABLES WHERE NAME = 'TEST1'
NAMECOMPRESSIONAVGROWSIZEPCTPAGESSAVEDPCTROWSCOMPRESSED    AVGROWCOMPRESSIONRATIO   AVGCOMPRESSEDROWSIZE      
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -      
TEST1   N         45             0            0                  0                            0            
1 条记录已选择。      
       总结一下,如果对一个新表启用表压缩:
l         创建一个表,将表的COMPRESS属性设置为 YES
l         对表装入一部分数据
l         执行带有RESETDICTIONARY选项的脱机重组,创建一个新的压缩字典
l         装入剩余的数据到这个表中(装入时将考虑压缩字典并在装入时压缩数据)
页: [1]
查看完整版本: db2 data compression feature testing