Redshift 副本从分析创建不同的压缩编码

Posted

技术标签:

【中文标题】Redshift 副本从分析创建不同的压缩编码【英文标题】:Redshift copy creates different compression encodings from analyze 【发布时间】:2017-07-14 01:38:16 【问题描述】:

我注意到 AWS Redshift 推荐的列压缩编码与其在将数据(通过 COPY)加载到空表时自动创建的编码不同。

例如,我创建了一个表并从 S3 加载数据如下:

CREATE TABLE Client (Id varchar(511) , ClientId integer , CreatedOn timestamp, 
UpdatedOn timestamp ,  DeletedOn timestamp , LockVersion integer , RegionId 
varchar(511) , OfficeId varchar(511) , CountryId varchar(511) ,  
FirstContactDate timestamp , DidExistPre boolean , IsActive boolean , 
StatusReason integer ,  CreatedById varchar(511) , IsLocked boolean , 
LockType integer , KeyWorker varchar(511) ,  InactiveDate timestamp , 
Current_Flag varchar(511) );

Table Client 创建执行时间:0.3s

copy Client from 's3://<bucket-name>/<folder>/Client.csv' 
credentials 'aws_access_key_id=<access key>; aws_secret_access_key=<secret>' 
csv fillrecord truncatecolumns ignoreheader 1 timeformat as 'YYYY-MM-
DDTHH:MI:SS' gzip acceptinvchars compupdate on region 'ap-southeast-2';    

警告:加载到表“客户端”已完成,24284 条记录 加载成功。加载到表“客户端”完成,6 记录已加载了为 ACCEPTINVCHARS 所做的替换。查看 'stl_replacements' 系统表了解详情。

0 行受影响的 COPY 成功执行

执行时间:3.39s

完成此操作后,我可以查看 COPY 应用的列压缩编码:

select "column", type, encoding, distkey, sortkey, "notnull" 
from pg_table_def where tablename = 'client';

给予:

╔══════════════════╦═════════════════════════════╦═══════╦═══════╦═══╦═══════╗
║ id               ║ character varying(511)      ║ lzo   ║ false ║ 0 ║ false ║
║ clientid         ║ integer                     ║ delta ║ false ║ 0 ║ false ║
║ createdon        ║ timestamp without time zone ║ lzo   ║ false ║ 0 ║ false ║
║ updatedon        ║ timestamp without time zone ║ lzo   ║ false ║ 0 ║ false ║
║ deletedon        ║ timestamp without time zone ║ none  ║ false ║ 0 ║ false ║
║ lockversion      ║ integer                     ║ delta ║ false ║ 0 ║ false ║
║ regionid         ║ character varying(511)      ║ lzo   ║ false ║ 0 ║ false ║
║ officeid         ║ character varying(511)      ║ lzo   ║ false ║ 0 ║ false ║
║ countryid        ║ character varying(511)      ║ lzo   ║ false ║ 0 ║ false ║
║ firstcontactdate ║ timestamp without time zone ║ lzo   ║ false ║ 0 ║ false ║
║ didexistprecirts ║ boolean                     ║ none  ║ false ║ 0 ║ false ║
║ isactive         ║ boolean                     ║ none  ║ false ║ 0 ║ false ║
║ statusreason     ║ integer                     ║ none  ║ false ║ 0 ║ false ║
║ createdbyid      ║ character varying(511)      ║ lzo   ║ false ║ 0 ║ false ║
║ islocked         ║ boolean                     ║ none  ║ false ║ 0 ║ false ║
║ locktype         ║ integer                     ║ lzo   ║ false ║ 0 ║ false ║
║ keyworker        ║ character varying(511)      ║ lzo   ║ false ║ 0 ║ false ║
║ inactivedate     ║ timestamp without time zone ║ lzo   ║ false ║ 0 ║ false ║
║ current_flag     ║ character varying(511)      ║ lzo   ║ false ║ 0 ║ false ║
╚══════════════════╩═════════════════════════════╩═══════╩═══════╩═══╩═══════╝

我可以这样做:

analyze compression client;

给予:

╔════════╦══════════════════╦═══════╦═══════╗
║ client ║ id               ║ zstd  ║ 40.59 ║
║ client ║ clientid         ║ delta ║ 0.00  ║
║ client ║ createdon        ║ zstd  ║ 19.85 ║
║ client ║ updatedon        ║ zstd  ║ 12.59 ║
║ client ║ deletedon        ║ raw   ║ 0.00  ║
║ client ║ lockversion      ║ zstd  ║ 39.12 ║
║ client ║ regionid         ║ zstd  ║ 54.47 ║
║ client ║ officeid         ║ zstd  ║ 88.84 ║
║ client ║ countryid        ║ zstd  ║ 79.13 ║
║ client ║ firstcontactdate ║ zstd  ║ 22.31 ║
║ client ║ didexistprecirts ║ raw   ║ 0.00  ║
║ client ║ isactive         ║ raw   ║ 0.00  ║
║ client ║ statusreason     ║ raw   ║ 0.00  ║
║ client ║ createdbyid      ║ zstd  ║ 52.43 ║
║ client ║ islocked         ║ raw   ║ 0.00  ║
║ client ║ locktype         ║ zstd  ║ 63.01 ║
║ client ║ keyworker        ║ zstd  ║ 38.79 ║
║ client ║ inactivedate     ║ zstd  ║ 25.40 ║
║ client ║ current_flag     ║ zstd  ║ 90.51 ║
╚════════╩══════════════════╩═══════╩═══════╝

即完全不同的结果。

我很想知道为什么会这样?我知道 ~24K 记录少于 AWS specifies 作为有意义的压缩分析样本所需的 100K,但是 COPY 和 ANALYZE 为同一个 24K 行表给出不同的结果似乎仍然很奇怪。

【问题讨论】:

我也经常看到这种情况,即使有超过 10 万条记录。 【参考方案1】:

COPY 目前不推荐 ZSTD,这就是推荐的压缩设置不同的原因。

如果您希望在希望最大化压缩(使用最少的空间)的永久表上应用压缩,则全面设置 ZSTD 将使您接近最佳压缩。

RAW 重新出现在某些列上的原因是,在这种情况下,应用压缩没有任何优势(压缩和不压缩的块数相同)。如果您知道表会增长,那么对这些列也应用压缩是有意义的。

【讨论】:

以上是关于Redshift 副本从分析创建不同的压缩编码的主要内容,如果未能解决你的问题,请参考以下文章

创建 Redshift 生产的副本,每个表中的 # 条记录有限

Redshift COPY 自动压缩

将排序键和压缩用于带有 Redshift 的临时表

amazon redshift 分析型数据库特点——本质还是列存储

使用 json 的亚马逊 redshift 副本遇到问题

引号中嵌入换行符的 Redshift 副本