Amazon Redshift
数据库开发人员指南 (API Version 2012-12-01)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

测试压缩编码

如果您决定手动指定列编码,则您可能需要针对自己的数据测试不同的编码。

注意

我们建议您尽可能使用 COPY 命令加载数据,并允许 COPY 命令根据您的数据选择最佳的编码。或者,您也可以使用 ANALYZE COMPRESSION 命令查看推荐针对现有数据采用的编码。有关应用自动压缩的详细信息,请参阅使用自动压缩加载表

要执行有意义的数据压缩测试,您需要数量较多的行。在本示例中,我们将使用从两个表 VENUE 和 LISTING 中进行选择的语句来创建表并插入行。我们将省略通常用于联接两个表的 WHERE 子句;结果是 VENUE 表中的 行都联接到 LISTING 表中的所有 行(总计超过 3200 万行)。这称作笛卡尔联接,通常不建议使用,但对于我们的示例来说,这种方法可以方便地创建大量的行。如果您现有的表包含想要测试的数据,则您可以跳过这一步。

在获得包含示例数据的表后,我们创建一个包含七个列的表,每列采用不同的压缩编码:raw、bytedict、lzo、runlength、text255、text32k 和 zstd。我们通过执行从第一个表选择数据的 INSERT 命令,用完全相同的数据填充每一列。

测试压缩编码:

  1. (可选) 首先,我们将使用笛卡尔联接创建一个包含大量行的表。如果您想要测试现有的表,则请跳过这一步。

    Copy
    create table cartesian_venue( venueid smallint not null distkey sortkey, venuename varchar(100), venuecity varchar(30), venuestate char(2), venueseats integer); insert into cartesian_venue select venueid, venuename, venuecity, venuestate, venueseats from venue, listing;
  2. 接下来,使用您要进行比较的编码创建表。

    Copy
    create table encodingvenue ( venueraw varchar(100) encode raw, venuebytedict varchar(100) encode bytedict, venuelzo varchar(100) encode lzo, venuerunlength varchar(100) encode runlength, venuetext255 varchar(100) encode text255, venuetext32k varchar(100) encode text32k, venuezstd varchar(100) encode zstd);
  3. 使用带 SELECT 子句的 INSERT 语句将相同的数据插入到所有列中。

    Copy
    insert into encodingvenue select venuename as venueraw, venuename as venuebytedict, venuename as venuelzo, venuename as venuerunlength, venuename as venuetext32k, venuename as venuetext255, venuename as venuezstd from cartesian_venue;
  4. 验证新表中的行数。

    Copy
    select count(*) from encodingvenue count ---------- 38884394 (1 row)
  5. 查询 STV_BLOCKLIST 系统表,比较每列使用的 1 MB 磁盘数据块的数量。

    MAX 聚合函数返回每列的最大数据块数。STV_BLOCKLIST 表包含三个系统生成的列的详细信息。本示例在 WHERE 子句中使用 col < 6 来排除系统生成的列。

    Copy
    select col, max(blocknum) from stv_blocklist b, stv_tbl_perm p where (b.tbl=p.id) and name ='encodingvenue' and col < 7 group by name, col order by col;

    查询返回以下结果。列从零开始编号。根据群集的配置方式,您的结果可能具有不同的编号,但相对大小应相差不大。对于该数据集,您会看到第二列上的 BYTEDICT 编码能够产生最佳结果,压缩率高于 20:1。LZO 和 ZSTD 编码也生成了极佳的结果。当然,不同的数据集会导致不同的结果。当列包含较长的文本字符串时,LZO 往往能够产生最佳的压缩结果。

    Copy
    col | max -----+----- 0 | 203 1 | 10 2 | 22 3 | 204 4 | 56 5 | 72 6 | 20 (7 rows)

如果您现有的表中包含数据,则您可以使用 ANALYZE COMPRESSION 命令查看针对该表的建议编码。例如,下面的示例显示了对于 VENUE 表的副本 CARTESIAN_VENUE (包含 3800 万行数据) 建议的编码。注意,ANALYZE COMPRESSION 为 VENUENAME 列推荐 LZO 编码。ANALYZE COMPRESSION 基于多个因素选择最佳压缩,包括减少百分比。在这种特定情况下,BYTEDICT 提供更好的压缩,但 LZO 也会生成大于 90% 的压缩。

Copy
analyze compression cartesian_venue; Table | Column | Encoding | Est_reduction_pct ---------------+------------+----------+------------------ reallybigvenue | venueid | lzo | 97.54 reallybigvenue | venuename | lzo | 91.71 reallybigvenue | venuecity | lzo | 96.01 reallybigvenue | venuestate | lzo | 97.68 reallybigvenue | venueseats | lzo | 98.21