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

使用自动压缩加载表

您可以根据自己对数据的评估将压缩编码手动应用于表中的列,也可以使用 COPY 命令自动分析和应用压缩。我们强烈建议使用 COPY 命令应用自动压缩。

您可以在创建并加载全新的表时使用自动压缩。COPY 命令将执行分析压缩。您也可以通过以下方式执行压缩分析而不加载数据或更改对表的压缩:对已填充的表运行 ANALYZE COMPRESSION 命令。例如,您可以在想要分析对表的压缩以供将来使用时运行 ANALYZE COMPRESSION 命令,同时保留现有 DDL。

自动压缩将在选择压缩编码时平衡整体性能。如果排序键列的压缩率远高于同一查询中的其他列,则范围受限扫描的执行效果可能会很差。因此,自动压缩将选择一个效率较低的压缩编码来让排序键列与其他列保持平衡。但是,ANALYZE COMPRESSION 不会考虑排序键列,因此它可能为排序键推荐一个不同于自动压缩所选编码的编码。如果您使用 ANALYZE COMPRESSION,请考虑为排序键将编码更改为 RAW。

自动压缩的工作方式

默认情况下,当您对空目标表运行 COPY 命令并且所有表列具有 RAW 编码或没有编码时,该命令将应用于自动压缩。

要将自动压缩应用于空表而不管其当前压缩编码如何,请运行 COPY 命令,同时将 COMPUPDATE 选项设置为 ON。要禁用自动压缩,请运行 COPY 命令,同时将 COMPUPDATE 选项设置为 OFF。

您不能将自动压缩应用于已包含数据的表。

注意

自动压缩分析要求加载数据中有足够多的行(每个切片至少 100000 行),以生成有意义的样本。

作为加载事务的一部分,自动压缩将在后台执行以下操作:

  1. 从输入文件加载初始的行样本。样本大小基于 COMPROWS 参数的值。默认值为 100000。

  2. 为每个列选择压缩选项。

  3. 从表中删除样本行。

  4. 以所选的压缩编码重新创建表。

  5. 使用新编码加载并压缩整个输入文件。

运行 COPY 命令后,表将会完全加载、压缩并可供使用。如果您在以后加载了更多数据,追加的行将根据现有编码进行压缩。

如果您只是想执行压缩分析,请运行 ANALYZE COMPRESSION,这比运行完整的 COPY 操作效率更高。然后,您可以评估结果以决定是使用自动压缩还是手动重新创建表。

只有 COPY 命令才支持自动压缩。或者,您也可以在创建表时手动应用压缩编码。有关手动压缩编码的信息,请参阅选择列压缩类型

自动压缩示例

在本示例中,假定 TICKIT 数据库包含 LISTING 表的一个名为 BIGLIST 的副本,并且您希望在该表加载了大约 300 万行时对其应用自动压缩。

加载和自动压缩表

  1. 确保表是空的。您只能将自动压缩应用于空表:

    Copy
    truncate biglist;
  2. 使用单个 COPY 命令加载表。尽管表是空的,但之前可能已指定某种编码。要确保 Amazon Redshift 执行压缩分析,请将 COMPUPDATE 参数设置为 ON。

    Copy
    copy biglist from 's3://mybucket/biglist.txt' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' delimiter '|' COMPUPDATE ON;

    由于未指定 COMPROWS 选项,因此将使用默认和推荐的样本大小(100,000 行/切片)。

  3. 查看 BIGLIST 表的新 schema 以了解自动选择的编码方案。

    Copy
    select "column", type, encoding from pg_table_def where tablename = 'biglist'; Column | Type | Encoding ---------------+-----------------------------+---------- listid | integer | delta sellerid | integer | delta32k eventid | integer | delta32k dateid | smallint | delta +numtickets | smallint | delta priceperticket | numeric(8,2) | delta32k totalprice | numeric(8,2) | mostly32 listtime | timestamp without time zone | none
  4. 验证是否已加载所需的行数:

    Copy
    select count(*) from biglist; count --------- 3079952 (1 row)

以后使用 COPY 或 INSERT 语句向此表追加行时,将应用相同的压缩编码。