使用自动压缩加载表 - Amazon Redshift

使用自动压缩加载表

您可以根据您自己的数据评估,手动将压缩编码应用于表中的各个列。或者,您可以使用 COPY 命令并将 COMPUPDATE 设置为 ON,以便根据示例数据自动分析和应用压缩。

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

自动压缩将在选择压缩编码时平衡整体性能。如果排序键列的压缩率远高于同一查询中的其他列,则范围受限扫描的执行效果可能会很差。因此,自动压缩会跳过排序键列上的数据分析阶段,并保留用户定义的编码类型。

如果您尚未明确定义某种编码,则自动压缩会选择 RAW 编码。ANALYZE COMPRESSION 的行为相同。要获得最佳查询性能,请考虑将 RAW 用于排序键。

自动压缩的工作方式

如果 COMPUPDATE 参数为 ON,每次为空目标表运行 COPY 命令并且所有表列具有 RAW 编码或没有编码时,COPY 命令将会应用自动压缩。

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

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

注意

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

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

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

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

  3. 从表中删除样本行。

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

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

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

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

只有 COPY 命令才支持自动压缩。或者,您也可以在创建表时手动应用压缩编码。有关手动压缩编码的信息,请参阅列压缩,减小存储数据的大小

自动压缩示例

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

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

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

    COPY biglist FROM 's3://amzn-s3-demo-bucket/biglist.txt' IAM_ROLE 'arn:aws:iam::0123456789012:role/MyRedshiftRole' DELIMITER '|' COMPUPDATE ON;

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

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

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

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

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