本主题总结了数据库引擎如何实现页面压缩。 此摘要提供基本信息,可帮助你规划数据所需的存储空间。
页面压缩类似于表、表分区、索引和索引分区。 表的页面压缩的以下说明同样适用于所有对象类型的页面压缩。 以下示例压缩字符串,但前缀和字典压缩都对其他数据类型应用了相同的原则。
按以下顺序对表和索引的叶级进行页级压缩,包含三个操作:
行压缩
前缀压缩
字典压缩
使用页面压缩时,索引的非叶级页仅使用行压缩进行压缩。 有关行压缩的详细信息,请参阅 行压缩实现。
前缀压缩
对于正在压缩的每个页面,前缀压缩使用以下步骤:
对于每个列,标识一个值,该值可用于减少每列中值的存储空间。
将创建一个表示每个列的前缀值的行,并存储在紧跟页面页眉之后的压缩信息 (CI) 结构中。
列中重复的前缀值将替换为对相应前缀的引用。 如果行中的值与所选前缀值不完全匹配,仍可以指示部分匹配。
下图显示了前缀压缩前表的示例页。
下图显示了前缀压缩后的同一页。 前缀将移动到标头,列值将更改为对前缀的引用。
在第一行的第一列中,值 4b 表示这一行的前缀中包含前四个字符(aaab),以及字符 b。 这使得生成的结果值是 aaabb,与原始值相同。
字典压缩
前缀压缩已完成后,将应用字典压缩。 字典压缩搜索页面上的任意位置的重复值,并将其存储在 CI 区域中。 与前缀压缩不同,字典压缩不限于一列。 字典压缩可以替换页面上任意位置发生的重复值。 下图显示了字典压缩后的同一页。
请注意,值 4b 已从页面的不同列引用。
页面压缩发生时
创建具有页面压缩的新表时,不会发生压缩。 但是,表的元数据指示应使用页面压缩。 将数据添加到第一个数据页时,数据会进行行压缩。 由于页面未满,因此不会从页面压缩中获得任何好处。 当页面已满时,要添加的下一行将启动页面压缩作。 整页被审核;对每一列进行前缀压缩评估,然后对所有列进行字典压缩评估。 如果页面压缩在页面上腾出了足够的空间来插入额外的行,则该行会被添加,且数据会同时进行行压缩和页面压缩。 如果页面压缩获取的空间减去 CI 结构所需的空间并不重要,则页压缩不会用于该页。 将来的行要么适合新页面,要么如果不适合,则会将新页面添加到表中。 与第一页类似,新页面未进行首页压缩。
当包含数据的现有表转换为页面压缩时,将重新生成和评估每一页。 重新生成所有页面会导致重新生成表、索引或分区。