页压缩的实现
表、表分区、索引和索引分区的页压缩都是类似的。以下针对表的页压缩的说明同样适用于所有对象类型的页压缩。以下示例压缩的是字符串,但对于其他数据类型而言,前缀压缩和字典压缩的原理都是相同的。
使用页压缩压缩表和索引的叶级别的过程由按以下顺序进行的三个操作组成:
-
行压缩
-
前缀压缩
-
字典压缩
当使用页压缩时,将仅使用行压缩来压缩索引的非叶级别页。有关行压缩的详细信息,请参阅行压缩的实现。
当创建具有页压缩的新表时,不会进行压缩。但是,表的元数据会指示应 使用页压缩。当将数据添加到第一个数据页时,会对数据进行行压缩。因为此页未满,所以无法通过页压缩获得任何益处。如果页已满,则添加下一行将引导页压缩 操作。将查看整个页;计算每一列以进行前缀压缩,然后计算所有列以进行字典压缩。如果页压缩已在页上为要添加的行创建了足够的空间,则添加该行,并对数据 进行行压缩和页压缩。如果通过页压缩获得的空间减去 CI 结构所需空间之后剩余的空间并不充足,则不会对此页使用页压缩。以后,行将添加到新页上,如果新页中也无法再容纳更多的行,则将再向表中添加一个新页。与 第一页类似,新页最初也不进行页压缩。
当包含数据的现有表转换为页压缩时,将重新生成和计算每一页。重新生成所有页会导致重新生成表、索引或分区。