可以自动或手动构建为了压缩行而启用的表的压缩字典。
自动创建字典
从 DB2® V9.5 开始,如果满足下面的每个条件,那么将自动创建压缩字典:
- 已将表的 COMPRESS 属性设置为 YES。可以在创建表时使用 CREATE TABLE 语句的 COMPRESS YES 选项将此属性设置为 YES;也可以在 ALTER TABLE 语句中使用此选项将现有表改变为使用压缩功能
- 该表尚不存在压缩字典
- 表已经达到一定大小,有足够的数据用于构造重复数据的字典。
如果仍然启用了压缩功能,就会使用该压缩字典对后来移入该表的数据进行压缩。
下图显示了自动创建压缩字典的过程:
- 由于表是空的而未创建压缩字典。
- 数据是使用插入或装入操作插入表中的,并且保持未压缩。
- 随着更多数据被插入或装入表中,它保持未压缩。
- 如果 COMPRESS 属性设置为 YES,那么在达到阈值之后就会自动触发字典的创建过程。
- 创建了字典。
- 已将字典追加至表。
- 从此时起,数据就是压缩的。
要点: 只会对在创建字典之后才插入表中的行进行压缩。不会对创建字典之前就已存在的那些行进行压缩,除非已经更改了这些行,或者手动重建了字典。
如果您使用 DB2 V9.7 来创建表,并且此表至少包含一个 XML 类型的列,那么将使用第二个压缩字典来压缩存储在与该表相关联的缺省 XML 存储器对象中的 XML 数据。如果已将该表的 COMPRESS 属性设置为 YES,该 XML 存储器对象中尚不存在压缩字典并且该 XML 存储器对象中有足够的数据,那么将自动创建压缩字典。
限制: 无法对使用 DB2 V9.5 或 DB2 V9.1 创建的 XML 列中的数据进行压缩。但是,如果表中没有使用该产品的较低发行版创建的 XML 列,就可以对使用 DB2 V9.7 添加到该表中的 XML 列进行压缩。如果您在较低发行版中创建的表已经有一个或多个 XML 列,而您想使用 DB2 V9.7 来添加已压缩的 XML 列,那么必须使用 ADMIN_MOVE_TABLE 存储过程来迁移该表,然后才能使用压缩。
临时表的压缩字典也是使用相似的机制自动创建的。但是,数据库管理器将根据诸如查询复杂程度和结果集大小等因素来确定是否对临时表使用行压缩。
手动创建字典
尽管启用了压缩功能的表增大到足够大时就会自动创建字典,但是如果不存在压缩字典,您也可以强制创建压缩字典,或者使用带有 RESETDICTIONARY 选项的 REORG TABLE 命令将现有压缩字典复位。如果表中至少有一行数据,那么此命令将强制创建压缩字典。对表进行重组是一项脱机操作;使用“自动创建字典”这项功能的一个好处就是,构建字典时,表仍然处于联机状态。
除了使用 REORG TABLE 命令来强制创建新字典之外,您也可以使用带有 ROWCOMPESTIMATE 选项的 INSPECT 命令来创建新字典。如果表没有字典,那么此命令就会创建新的压缩字典。使用此方法的优点在于,创建字典时该表仍然保持联机状态。将对您后续添加的行进行压缩,但是不会对运行 INSPECT 命令之前就已存在的行进行压缩,直到您对该表执行重组为止。
复位压缩字典
无论是自动还是手动创建压缩字典,字典均为静态;在构建之后也不会更改。当您添加或更新行时,将根据当前压缩字典中存在的数据来压缩这些行。此行为在许多情况下都存在。例如,以用于维护城市自来水公司客户帐户的数据库中的表为例。这样一个表中可能有 STREET_ADDRESS、CITY、PROVINCE、TELEPHONE_NUM、POSTAL_CODE 和 ACCOUNT_TYPE 等列。如果使用这种表中的数据构建了压缩字典,即使它只是一个适当大小的表,也可能存在足够多的重复信息,因此对它进行行压缩将节省大量空间。这是因为不同客户之间可能有许多共同数据,例如 CITY、POSTAL_CODE 和 PROVINCE 都相同,而 STREET_ADDRSS 或 TELEPHONE_NUM 列的某些部分相同。
但是,其他表可能会随时间推移而显著更改。以一个用于存储零售数据的范围分区表为例,如下所示:
- 每个分区将存储一年中特定月份的数据,
- 在月末,将使用 ALTER TABLE 语句的 ATTACH PARTITION 子句将具有所给定月份的销售数据的分区转入该表中。
这种情况下,在某个月份(比如说,四月份)创建的压缩字典可能不会反映后续月份的重复销售数据。在表中数据随时间推移而显著更改的情况下,您可能希望使用带有
RESETDICTIONARY 选项的
REORG TABLE 命令来复位压缩字典。