Mostly 编码 - Amazon Redshift

Mostly 编码

当列的数据类型大于大多数存储值所需时,Mostly 编码会很有用。通过为此类型的列指定 Mostly 编码,您可以将该列中的大部分值压缩成较小的标准存储大小。无法压缩的剩余值以原始形式存储。例如,您可以将 16 位列(如 INT2 列)压缩为 8 位存储。

一般说来,Mostly 编码适用于以下数据类型:

  • SMALLINT/INT2(16 位)

  • INTEGER/INT(32 位)

  • BIGINT/INT8(64 位)

  • DECIMAL/NUMERIC(64 位)

请选择适当的 Mostly 编码版本,以契合列的数据类型大小。例如,对于 16 位整数列,可以应用 MOSTLY8。不允许对 16 位数据类型列应用 MOSTLY16 或对 32 位数据类型列应用 MOSTLY32。

当列中相对较多的值无法压缩时,大部分编码的效率可能比不压缩的效率还低。在将其中一个编码应用于列之前,请执行检查。您打算现在加载(以及未来可能加载)的大多数值应该适合下表所示的范围。

编码 压缩的存储大小 可压缩的值的范围(超出范围的值以原始形式存储)
MOSTLY8 1 字节(8 位) -128 到 127
MOSTLY16 2 字节(16 位) -32768 到 32767
MOSTLY32 4 字节(32 位) -2147483648 到 +2147483647
注意

对于小数值,忽略小数点以确定该值是否适合范围。例如,将 1234.56 视为 123456,因此,可压缩到 MOSTLY32 列中。

例如,VENUE 表中的 VENUEID 列定义为原始整数列,这意味着其值占用 4 个字节的存储。但是,该列中值的当前范围为 0309。因此,为 VENUEID 使用 MOSTLY16 编码并重新创建和重新加载该表可将该列中每个值的存储缩减为 2 个字节。

如果另一个表引用的 VENUEID 值主要处于 0 到 127 的范围内,则可以将该外键列编码为 MOSTLY8。在做出选择之前,请对引用表数据运行多个查询,以确定大多数值是处于 8 位、16 位还是 32 位范围内。

下表显示了使用 MOSTLY8、MOSTLY16 和 MOSTLY32 编码时特定数值的压缩大小:

原始值 原始 INT 或 BIGINT 大小(字节) MOSTLY8 压缩大小(字节) MOSTLY16 压缩大小(字节) MOSTLY32 压缩大小(字节)
1 4 1 2 4
10 4 1 2 4
100 4 1 2 4
1000 4 与原始数据大小相同 2 4
10000 4 2 4
20000 4 2 4
40000 8 与原始数据大小相同 4
100000 8 4
2000000000 8 4