编码类型

Vertica 支持各种编码和压缩类型,由以下 ENCODING 参数实参指定:

创建投影时,您可以在投影列上设置编码类型。您还可以使用 ALTER TABLE...ALTER COLUMN 更改给定表的一个或多个投影列的编码。

AUTO(默认)

AUTO 对于已排序、多值的列是理想的方案,如对于主键。除此之外,它还适用于其他编码或压缩方案不适用的一般用途。因此,在未指定编码/压缩类型的情况下,它将作为默认类型。

BINARY/VARBINARY
BOOLEAN
CHAR/VARCHAR
FLOAT
基于 Lempel-Ziv-Oberhumer (LZO) 的压缩
DATE/TIME/TIMESTAMP
INTEGER
INTERVAL
基于连续列值之间的增量的压缩方案。

此类型对 CPU 的要求相对较小。最坏的情况,LZO 数据可能膨胀百分之八 (8%),整数数据可能膨胀百分之二十 (20%)。

BLOCK_DICT

对于每个存储块,Vertica 会将不同列值编译到词典中,然后存储词典和索引列表,用以表示该数据块。

BLOCK_DICT 对于少值、未排序的列是理想方案,因为在这种情况下,节省空间比编码速度更重要。某些类数据(如股票价格)经过排序后(如按股票代码和时间戳)在局部区域内通常都是少值的,很适合选择 BLOCK_DICT 方案。相反,CHAR/VARCHAR 列则不适合选择 BLOCK_DICT 编码。

包含 0x00 或 0xFF 字符的 CHAR 和 VARCHAR 列不应使用 BLOCK_DICT 编码。同样,BINARY/VARBINARY 列也不支持 BLOCK_DICT 编码。

BLOCK_DICT 编码需要占用的 CPU 要远远超过默认编码方案。最大数据膨胀率为百分之八 (8%)。

BLOCKDICT_COMP

此编码类型与 BLOCK_DICT 类似,只不过其词典索引为熵编码。此编码类型需要更多的 CPU 时间来编码和解码,其最坏情况性能较差。但如果值分布倾斜极为严重,使用 BLOCK_DICT_COMP 编码可节省空间。

BZIP_COMP

BZIP_COMP 编码对块内容使用 bzip2 压缩算法。有关更多信息,请参阅 bzip 网站。此算法的压缩率较自动 LZO 和 gzip 编码高;但它需要更多的 CPU 时间执行压缩。此算法最好用于大型字符串列,例如 VARCHAR、VARBINARY、CHAR 和 BINARY。如果想牺牲加载速度,换取较高的数据压缩率,那么请选择此编码类型。

COMMONDELTA_COMP

此压缩方案会为块中所有增量构建一个词典,然后使用熵编码将索引存储到增量词典中。

对于已排序的 FLOAT 和基于 INTEGER (DATE/TIME/TIMESTAMP/INTERVAL)、序列可预见且仅偶有序列断点的数据列(如按周期性间隔记录的时间戳,或者主键),此方案是理想选择。例如,以下序列的压缩效果很好:300, 600, 900, 1200, 1500, 600, 1200, 1800, 2400。以下序列的压缩效果则很差:1, 3, 6, 10, 15, 21, 28, 36, 45, 55。

如果增量分布非常好,那么列将能够以每行少于一个字节的方式存储。但是,此方案会占用大量的 CPU。如果对增量很随意的数据使用此方案,那么可能引发大幅度的数据膨胀。

DELTARANGE_COMP

此压缩方案主要用于浮点数据;它以相对于上一个值的增量的形式存储各值。

对于已排序或限定在一定范围内的多值 FLOAT 列,此方案是理想选择。请勿对包含 NULL 值的未排序列使用此方案,因为表示 NULL 值所消耗的存储量非常高。此方案的压缩和解压过程的损耗都很高。

要确定 DELTARANGE_COMP 是否适合特定数据集,可以将其与其他方案进行对比。要确保与投影使用相同的排序顺序,且要选择将以连续方式存储在数据库中的示例数据。

DELTAVAL

对于 INTEGER 和 DATE/TIME/TIMESTAMP/INTERVAL 列,将以与数据库中最小值的差的形式记录数据。此编码对于其他数据类型没有任何作用。

DELTAVAL 最适合多值、未排序整数或基于整数的列。此编码类型对 CPU 的要求最低,而且数据永不会膨胀。

GCDDELTA

对于 INTEGER 和 DATE/TIME/TIMESTAMP/INTERVAL 列,以及只有 18 位或少于 18 位的 NUMERIC 列,将以与数据块中最小值的差除以块中所有条目的最大公约数 (GCD) 的形式存储数据。此编码对于其他数据类型没有任何作用。

ENCODING GCDDELTA 最适合值为同一因子倍数情况下的多值、未排序、整数列或基于整数的列。例如,时间戳在内部以微秒为单位存储,因此,仅精确到毫秒的数据均为 1000 倍。GCDDELTA 编码类型的解码过程对 CPU 的要求最低,且数据永不膨胀,但 GCDDELTA 的编码时间要比 DELTAVAL 长。

GZIP_COMP

此编码类型使用 gzip 压缩算法。有关更多信息,请参阅 gzip 网站。此算法的压缩效果要比自动 LZO 压缩好,但比 BZIP_COMP 的压缩率低。它执行压缩占用的 CPU 时间比 LZO 多,比 BZIP_COMP 少。此算法最好用于大型字符串列,例如 VARCHAR、VARBINARY、CHAR 和 BINARY。想要压缩效果比 LZO 好、占用的 CPU 时间比 bzip2 少时,请使用此编码。

RLE

RLE(运行长度编码)将相同值的序列(运行)替换为包含值和出现次数的单个对。因此,它最适合出现在投影的 ORDER BY 子句中的低基数列。

Vertica 执行引擎按逐个运行的方式处理 RLE 编码,Vertica 优化器优先处理 RLE 编码。仅在运行长度较长时(如存储低基数列时)使用此类型。

Zstandard 压缩

Vertica 支持三种 ZSTD 压缩类型:

  • ZSTD_COMP 提供高压缩率。此编码类型的压缩率高于 gzip。想要压缩效果比 gzip 好时,请使用此编码。对于一般用例,请使用此编码或 ZSTD_FAST_COMP 编码类型。

  • ZSTD_FAST_COMP 使用 zstd 库提供的最快压缩级别。它是 zstd 库中最快的编码类型,但比其他两种编码类型占用更多空间。对于一般用例,请使用此编码或 ZSTD_COMP 编码类型。

  • ZSTD_HIGH_COMP 提供 zstd 库中的最佳压缩。它比其他两种编码类型慢。当您需要最佳压缩时,请使用此类型,但 CPU 时间较慢。