行压缩自 DB2 for Linux, UNIX, and ">Windows 9.1 版本产品(DB2 9.1 版本)开始引入。自此以后每个版本均对行压缩功能进行了大幅改进,并在 DB2 10.1 版本的新一代自适应压缩功能中达到极致。行压缩要求具备 DB2 Storage Optimization Feature 许可。
通过压缩技术节省存储空间通常意味着减少读取压缩表中的数据的物理 I/O 操作,因为存储相同数目的行占用的页面数更少。由于压缩技术可在相同数目的页面中打包更多的数据行,因而缓冲池命中率上升。在许多情况下,I/O 节省和缓冲池利用率提升会增加吞吐量并加快查询执行时间。
您可以分别对每个表进行行压缩。执行行压缩将会节省绝大多数实用表的存储空间。压缩率通常为 50% - 80% 或者更高。采用行压缩的表占用的存储空间绝不会超过同一个表的未压缩版本。
自 DB2 10.1 版本开始,包含以下两种类型的行压缩:
• 经典行压缩,指以下数据采用的压缩技术:
o 自 DB2 9.1 版本开始引入的用户表数据
o 自 DB2 for Linux, UNIX, and Windows 9.7 版本产品(DB2 9.7 版本)开始引入的 XML 数据和临时数据
• 自适应行压缩,自 DB2 10.1 版本开始引入的全新压缩模式,适用于用户表数据。自适应行压缩优于经典行压缩,它往往能够达到更好的压缩效果,同时保证压缩率接近最佳水平所需的数据库维护工作也更少。
经典行压缩
经典行压缩以基于字典的压缩算法为基础。每个表对象都对应一个压缩字典。该字典包含一种在整个表各行中频繁出现的模式映射。这种压缩字典称作“表级压缩字典”。
要执行行压缩,您必须启用压缩表,且数据或 XML 对象必须包含字典。要于创建表时在 DB2 10.1 版本中对表启用经典行压缩,请执行以下语句:
CREATE TABLE … COMPRESS YES STATIC
要对现有的表启用该压缩模式,请执行以下语句:
ALTER TABLE … COMPRESS YES STATIC
在 DB2 10.1 版本中,上述两种情况均强制执行 COMPRESS YES 语句的 STATIC 选项。在早期 DB2 版本中,无需进行任何进一步资格限定即可直接使用 COMPRESS YES 语句,如下所示:
CREATE TABLE … COMPRESS YES
ALTER TABLE … COMPRESS YES
为使经典行压缩在启用压缩功能的表中开始发挥作用,该表必须具有字典。如果您使用的是 DB2 9.1,则必须留意是否具有压缩字典,如有必要,请执行经典表重组或运行 INSPECT 实用程序来创建字典。
随着 DB2 for Linux, UNIX, and Windows 9.5 版本(DB2 9.5 版本)引入自动字典创建(Automatic Dictionary Creation,ADC)功能,表级字典的构建过程变得更加自动化。采用 ADC 后,每当启用压缩功能的表的大小超过 2 MB 时,接下来的插入操作都会触发表级压缩字典的构建过程。但是,不会对现有的行应用任何压缩模式:只有后续插入或更新才会产生压缩行。
自 DB2 9.5 版本开始,ADC 和经典表重组一直是构建表级压缩字典的两种主要方式。这两种方式会在各自产生的压缩率方面有所不同。ADC 根据创建字典之时出现的数据创建压缩字典。如果该表出现大幅增长或显著变化,则构建字典之时将仅包含该表中的一小部分数据。因此,系统可能仅会对这一小部分数据执行模式检测。但在经典表重组中,则会对整个表进行扫描,并会运用均匀分布于整个表的记录样例构建字典。
鉴于此,随着时间的推移,通过 ADC 构建的字典的存储空间节约量可能会低于经典表重组期间构建的字典。同样,久而久之,数据频繁更新的表的表级字典模式有效性可能会下降,无法再有效压缩这些不断变化的数据,进而导致压缩率下降。在这种情况下,可能需要定期执行经典表重组,以便始终保持较高的存储空间节约比率。