Amazon Redshift
数据库开发人员指南 (API Version 2012-12-01)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

步骤 5:审查压缩编码

压缩是可缩减数据存储大小的列级操作。压缩能够节约存储空间并减少从存储读取的数据大小,这种方法可以减少磁盘 I/O 量,因此可提高查询性能。

默认情况下,Amazon Redshift 以原始、未压缩的格式存储数据。在 Amazon Redshift 数据库中创建表时,您可以为列定义压缩类型或编码。有关更多信息,请参阅 压缩编码

创建表时,您可以向表中的列手动应用压缩编码,或者,您也可以使用 COPY 命令自动分析加载数据并应用压缩编码。

审查压缩编码

  1. 找出每列占用多少存储空间。

    查询 STV_BLOCKLIST 系统视图以找出每列使用的 1 MB 数据块的数量。MAX 聚合函数返回每列的最大数据块数。本示例在 WHERE 子句中使用 col < 17 来排除系统生成的列。

    执行下面的命令。

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

    您的结果类似于以下内容。

    Copy
    col | max ----+----- 0 | 572 1 | 572 2 | 572 3 | 572 4 | 572 5 | 572 6 | 1659 7 | 715 8 | 572 9 | 572 10 | 572 11 | 572 12 | 572 13 | 572 14 | 572 15 | 572 16 | 1185 (17 rows)
  2. 试验不同的编码方法。

    在此步骤中,您将创建具有相同列的表,但不同的是,每列采用了不同的压缩编码。然后,您使用 PART 表中 p_name 列的数据插入大量的行,使每一列具有相同的数据。最后,您将检查该表,以比较不同编码对列大小的影响。

    1. 使用您要进行比较的编码创建表。

      Copy
      create table encodingshipmode ( moderaw varchar(22) encode raw, modebytedict varchar(22) encode bytedict, modelzo varchar(22) encode lzo, moderunlength varchar(22) encode runlength, modetext255 varchar(22) encode text255, modetext32k varchar(22) encode text32k);
    2. 使用带 SELECT 子句的 INSERT 语句将相同的数据插入到所有列中。该命令执行时需要数分钟的时间。

      Copy
      insert into encodingshipmode select lo_shipmode as moderaw, lo_shipmode as modebytedict, lo_shipmode as modelzo, lo_shipmode as moderunlength, lo_shipmode as modetext255, lo_shipmode as modetext32k from lineorder where lo_orderkey < 200000000;
    3. 查询 STV_BLOCKLIST 系统表,比较每列使用的 1 MB 磁盘数据块的数量。

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

      该查询返回的结果类似于以下内容。根据群集的配置方式,您的结果会有所不同,但相对大小应相差不大。

      Copy
      col | max –------+----- 0 | 221 1 | 26 2 | 61 3 | 192 4 | 54 5 | 105 (6 rows)

      列显示以下编码的结果:

      • 原始

      • Bytedict

      • LZO

      • Runlength

      • Text255

      • Text32K

      对于该数据集,您会看到第二列上的 Bytedict 编码能够产生最佳结果,压缩率高于 8:1。当然,不同的数据集会导致不同的结果。

  3. 使用 ANALYZE COMPRESSION 命令查看针对现有表的建议编码。

    执行下面的命令。

    Copy
    analyze compression lineorder;

    您的结果应类似于以下内容。

    Copy
    Table | Column | Encoding -----------+------------------+------------------- lineorder lo_orderkey delta lineorder lo_linenumber delta lineorder lo_custkey raw lineorder lo_partkey raw lineorder lo_suppkey raw lineorder lo_orderdate delta32k lineorder lo_orderpriority bytedict lineorder lo_shippriority runlength lineorder lo_quantity delta lineorder lo_extendedprice lzo lineorder lo_ordertotalprice lzo lineorder lo_discount delta lineorder lo_revenue lzo lineorder lo_supplycost delta32k lineorder lo_tax delta lineorder lo_commitdate delta32k lineorder lo_shipmode bytedict

    注意,ANALYZE COMPRESSION 为 lo_shipmode 列选择了 BYTEDICT 编码。

    有关选择手动应用压缩编码的示例,请参阅示例:为 CUSTOMER 表选择压缩编码

  4. 向 SSB 表应用自动压缩。

    默认情况下,当您向除 RAW 编码以外没有任何压缩编码的空表加载数据时,COPY 命令会自动应用压缩编码。在本教程的下一步中,您将让 COPY 命令自动选择并应用适合表的最佳编码,重新创建测试数据集。

    有关更多信息,请参阅 使用自动压缩加载表

下一步

步骤 6:重新创建测试数据集

本页内容: