2. 对行压缩的增强
行压缩特性是 DB2 9 中最流行的特性之一。该特性弥补了已有的列级压缩、系统默认值压缩和值压缩选项。但是,在压缩输入到表中的数据之前,为了利用行压缩,必须首先使用 DB2 inspect utility 或离线 table reorg 构建一个字典。在 DB2 Viper 2 中,有一个称作 Automatic Dictionary Creation (ADC) 的新特性为解决这一需求提供的便利。
2.1 ADC 简介
ADC,顾名思义,是自动创建压缩字典的处理过程。首先必须启用表属性 COMPRESS,以便应用 ADC。此外,只有当物理表数据对象或分区中没有压缩字典时,才能运行 ADC。如果已经有一个字典,则不能激活 ADC。ADC 的前提是根据抽样的一小部分表数据自动创建一个代表性的压缩字典。创建好字典并自动将插入表之后,以后填充的所有数据都会被压缩。图 1 演示了 ADC 概念。
图 1. ADC
2.2 更多执行行压缩的方法
除了 inspect 实用程序和离线 table reorg 外,只要启用了表属性 COMPRESS ,并且有足够的可用数据(数据已经在表中,还有新的数据行或数据行的扩展),就可以在 LOAD INSERT、LOAD REPLACE、REDISTRIBUTE DATABASE PARTITION GROUP、INSERT 或 UPDATE 期间自动构建一个字典。
和离线 table reorg 一样,LOAD REPLACE 有 KEEPDICTIONARY 和 RESETDICTIONARY 选项。只需在 REPLACE 关键字后指定 KEEPDICTIONARY 或 RESETDICTIONARY 关键字。如果没有指定任何关键字,且表属性 COMPRESS 已启用,则使用 KEEPDICTIONARY 行为。
为了与新的 ADC 特性同步,离线 table reorg 的 KEEPDICTIONARY 行为已经被更改。欲了解更多信息,请参阅 “2.4 使用离线 reorg 实用程序的行压缩中的行为的变化” 小节。
如果在 inspect 工具中使用离线 table reorg 或 rowcompestimate 选项,则表中的数据将被完全压缩。对于其他接口,如 图 1 所示,抽样数据(用于构建 ADC 字典)直到执行离线 table reorg 时才被压缩。
2.3 影响 ADC 的因素
有两个因素会影响 ADC:可用于抽样的最小(阈值)数据量(ADC_THRESHOLD)和抽样缓冲区中有用数据的最小百分比(ADC_MINPCT)。这两个值由 DB2 在内部预先设置。
在不同的字典构建接口中,这两个因素的用法不同。当达到 ADC_THRESHOLD 时,ADC 就开始执行。但是,在抽样期间,装载和重分发实用程序不使用 ADC_MINPCT。
在使用装载实用程序将数据添加到一个表中,以及用重分发实用程序将数据重分发到表的一个新分区中的最后,这两个实用程序都会检查传入的新数据的数量,看看是否至少有 ADC_THRESHOLD * ADC_MINPCT 这么多的数据。如果有,那么它们仍然生成一个压缩字典,但是在这里,没有被压缩的记录,因为所有数据已经被移到表中。
装载实用程序和重分发实用程序的字典构建是异步的,所以在构建字典的同时,可以将数据装载或移动到新的分区。构建好字典之后,任何新传入的数据都要进行压缩。如果有两个并发的线程在执行到一个表的插入操作,那么会出现类似的情况。其中一个线程可能正在构建字典,而另一个线程则继续插入数据到表中,而不必等到构建完字典之后才对行进行压缩。
2.4 使用离线 reorg 实用程序的行压缩中的行为的变化
在 DB2 9 中,REORG TABLE 命令中的默认压缩字典指令是 KEEPDICTIONARY。如果表属性 COMPRESS 被设为 YES,并且表中还没有压缩字典,则 KEEPDICTIONARY 指令不管表中数据量如何,都会尝试构建一个压缩字典并将其插入表中。在这个场景中,只要表中存在一个有效的记录,就尝试创建一个字典。
随着 ADC 的引入,REORG TABLE KEEPDICTIONARY 场景的行为已经发生了变化。只有当表的大小等于 ADC 阈值时,才将字典插入到表中。
2.5 对于数据行小于或等于最小记录长度的表的行压缩中的行为变化
在 DB2 9 中,在构建字典时,任何小于或等于数据库管理器最小记录长度的数据行都不用于抽样,并且在行压缩期间不会被压缩。从 DB2 Viper 2 开始,所有数据行都参与抽样。但是,即使创建了字典,小于或等于数据库管理器最小记录长度的数据行仍不会被压缩。
2.6 用于压缩信息的新的表 UDF 和视图
DB2 Viper 2 还包括一个新的表 UDF SYSPROC.ADMIN_GET_TAB_COMPRESS_INFO 和一个新的管理视图 SYSIBMADM.ADMINTABCOMPRESSINFO。
新的管理视图 SYSIBMADM.ADMINTABCOMPRESSINFO 返回关于一个数据库的所有模式中所有表的压缩信息的报告。由于它是一个视图,因此可以加入谓词,以限制输出结果,使之符合要求。
新的表 UDF SYSPROC.ADMIN_GET_TAB_COMPRESS_INFO 有两个功能:一是报告指定表的压缩信息,二是根据当前表数据生成对新的压缩信息的估计。该 UDF 带有三个输入参数:tabschema、tabname 和 execmode。前两个参数可以使用空字符串或 NULL,以执行通配符(*)搜索。如果最后一个参数使用空字符串或 NULL,则假定为默认选项,即 REPORT。
SYSPROC.ADMIN_GET_TAB_COMPRESS_INFO UDF 的语法为:
>>- SYSPROC.ADMIN_GET_TAB_COMPRESS_INFO- -(--tabschema--,--tabname--,--execmode--)--<
下面是关于如何使用该 UDF 获得表 ROWCOMP.MDC 的压缩统计信息报告的例子:
select * from table(SYSPROC.ADMIN_GET_TAB_COMPRESS_INFO('ROWCOMP','MDC','REPORT' )) as T TABSCHEMA TABNAME DBPARTITIONNUM DATA_PARTITION_ID COMPRESS_ATTR DICT_BUILDER DICT_BUILD_TIMESTAMP COMPRESS_DICT_SIZE EXPAND_DICT_SIZ E ROWS_SAMPLED PAGES_SAVED_PERCENT BYTES_SAVED_PERCENT AVG_COMPRESS_REC_LENG TH -------------------------------------------------------------------------------- ------------------------------------------------ ------------------------------- -------------------------------------------------------------------------------- ------------------ -------------- ----------------- ------------- -------------- ---------------- -------------------------- -------------------- --------------- ----- ------------ ------------------- ------------------- --------------------- -- ROWCOMP MDC 0 0 Y TABLE GROWTH 2007-05-25-09.15.43.000000 66432 32768 2041 66 66 176 1 record(s) selected.
通过查看 pages_saved_percent 和 bytes_saved_percent 可以发现,这个表压缩得很好,节省了 66% 的存储空间。
ESTIMATE 对于判断对表进行压缩时可以多大程度上节省存储很有用。注意,为了使用该功能,不需要将表属性 COMPRESS 设为 yes。利用返回的数据,可以决定是否执行离线 table reorg,以利用行压缩。如果表是一个范围集群表(不支持行压缩),可以考虑将其变换为范围分区表(支持行压缩)。ESTIMATE 的另一个优点是允许比较已有字典与用最新表内容构建的新字典的有效性。