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

字节词典编码

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

此编码对低基数字符串列非常有效。如果列的数据域少于 256 个唯一值,则该编码是最佳的编码。

如果列使用通过 BYTEDICT 编码的字符串数据类型(CHAR 和 VARCHAR),Amazon Redshift 会直接对压缩数据进行矢量化扫描和谓词评估。这些扫描使用特定于硬件的单指令和多数据 (SIMD) 指令实现并行处理。这大大加快了扫描字符串列的速度。当 CHAR/VARCHAR 列包含长字符串时,字节词典编码的空间效率尤其高。

假设某个表包含数据类型为 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 个字节。