字节词典编码 - Amazon Redshift
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

字节词典编码

在字节词典编码中,会为磁盘上的每个列值数据块创建单独的唯一值词典。(一个 Amazon Redshift 磁盘数据块占用 1 MB 空间。) 该词典最多包含 256 个单字节值,这些值存储为原始数据值的索引。如果单个数据块中存储的值多于 256 个,则多余的值会以原始、未压缩的形式写入该数据块中。针对每个磁盘数据块重复这一过程。

当列包含有限数量的唯一值时,该编码非常有效。如果列的数据域少于 256 个唯一值,则该编码是最佳的编码。当 CHAR 列包含长字符串时,字节词典编码的空间效率会非常高。

注意

用于 VARCHAR 列时,字节词典编码有时并不高效。将 BYTEDICT 用于大型 VARCHAR 列可能导致占用的磁盘空间过多。对于 VARCHAR 列,我们强烈建议您使用 LZO 等其他编码。

假设表具有带 CHAR(30) 数据类型的 COUNTRY 列。在加载数据时,Amazon Redshift 会创建词典并使用索引值填充 COUNTRY 列。该词典包含已建立索引的唯一值,而表本身则只包含相应值的下标(只占一个字节)。

注意

固定长度字符列存储有尾随空格。因此,对 CHAR(30) 列使用字节词典编码时,每个压缩值可节约 29 个字节的存储空间。

下表表示 COUNTRY 列的词典。

唯一数据值 词典索引 大小(固定长度,每个值 30 个字节)
England 0 30
United States of America 1 30
Venezuela 2 30
Sri Lanka 3 30
Argentina 4 30
Japan 5 30
总计 180

下表表示 COUNTRY 列中的值。

原始数据值 原始大小(固定长度,每个值 30 个字节) 压缩值(索引) 新的大小(字节)
England 30 0 1
England 30 0 1
United States of America 30 1 1
United States of America 30 1 1
Venezuela 30 2 1
Sri Lanka 30 3 1
Argentina 30 4 1
Japan 30 5 1
Sri Lanka 30 3 1
Argentina 30 4 1
总计 300 10

本示例中的总计压缩大小按照如下方式计算:词典中存储着 6 个不同的条目 (6 * 30 = 180),表包含 10 个 1 字节的压缩值,总共占用 190 个字节。