字节词典编码
在字节词典编码中,会为磁盘上的每个列值数据块创建单独的唯一值词典。(一个 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 个字节。