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 个字节的存储。但是,该列中值的当前范围为 0
到 309
。因此,为 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 |