增量编码 - Amazon Redshift

增量编码

对于日期时间列,增量编码非常有用。

增量编码通过记录列中各个相邻值之间的差异来压缩数据。这种差异记录在磁盘上每个列值数据块的单独词典中。(一个 Amazon Redshift 磁盘数据块占用 1 MB 的空间。) 例如,假设列中包含 10 个从 1 到 10 的整数。第一个存储为 4 字节整数(加上 1 字节标记)。接下来的九个都存储为值为 1 的字节,表示它比前一个值大 1。

增量编码有两个版本:

  • DELTA 使用 1 字节的值(8 位整数)记录差值。

  • DELTA32K 使用 2 字节值(16 位整数)记录差值。

如果列中的大多数值可用单字节压缩,则 1 字节的变化会非常高效。但是,如果增量较大,则在最坏情况下,这种编码会比存储未压缩数据的效率还低。相似的逻辑也适用于 16 位版本。

如果两个值的差值超出 1 字节范围 (DELTA) 或 2 字节范围 (DELTA32K),则存储完整的原始值,并包含一个前置的 1 字节标志。1 字节的范围为 -127 到 127;2 字节的范围为 -32K 到 32K。

下表显示了对数值列应用增量编码的原理。

原始数据值 原始大小(字节) 差值(增量) 压缩值 压缩大小(字节)
1 4 1 1+4(标志 + 实际值)
5 4 4 4 1
50 4 45 45 1
200 4 150 150 1+4(标志 + 实际值)
185 4 -15 -15 1
220 4 35 35 1
221 4 1 1 1
总计 28 15