Redshift 性能:连接列上的编码

Posted

技术标签:

【中文标题】Redshift 性能:连接列上的编码【英文标题】:Redshift performance: encoding on join column 【发布时间】:2016-07-12 20:22:53 【问题描述】:

连接列上的编码会破坏查询性能吗?我让“COPY命令”来决定编码类型。

【问题讨论】:

【参考方案1】:

通常不会 - 因为您的 DIST KEY 上的编码甚至会因为减少磁盘 I/O 而产生积极影响。

根据AWS table design playbook,有一些极端情况确实是您的DIST KEY 上的编码会破坏您的查询性能:

您的查询模式将范围限制扫描应用于 压缩得很好。 压缩良好的列的每个块中的每个块都包含大量值,这些值通常比您的查询感兴趣的实际值数量多得多。 查询模式所需的其他列很大或压缩不好。这些列 > 10 倍于井的大小 压缩列。

如果您想为您的表格找到最佳编码,您可以使用Redshift column encoding utility。

【讨论】:

【参考方案2】:

Amazon Redshift 是一个面向列的数据库,这意味着不是按行组织磁盘上的数据,而是按列存储数据,并在运行时从列存储中提取行。这种架构特别适合对具有大量列的表进行分析查询,其中大多数查询仅访问所有可能维度和度量的子集。 Amazon Redshift 只能访问磁盘上那些包含在 SELECT 或 WHERE 子句中的列的块,并且不必读取所有表数据来评估查询。按列存储的数据也应该被编码,这意味着它被高度压缩以提供高读取性能。这进一步意味着 Amazon Redshift 不需要创建和维护索引:每一列几乎就像它自己的索引一样,只是存储数据的正确结构。

在没有列编码的情况下运行 Amazon Redshift 集群并不是最佳实践,当客户确保以最佳方式应用列编码时,他们会发现性能大幅提升。

所以你的问题不会破坏查询性能,但不是最佳实践。

【讨论】:

【参考方案3】:

AWS 受访者对此提供了一些详细信息: AWS Redshift : DISTKEY / SORTKEY columns should be compressed?

一般:

DISTKEY can be compressed but the first SORTKEY column should be uncompressed (ENCODE raw). 
If you have multiple sort keys (compound) the other sort key columns can be compressed.


Also, generally recommend using a commonly filtered date/timestamp column,
 (if one exists) as the first sort key column in a compound sort key.

Finally, if you are joining between very large tables try using the same dist
 and sort keys on both tables so Redshift can use a faster merge join.

基于此,我认为只要join的双方具有相同的压缩,我认为redshift会安全地加入压缩值。

【讨论】:

以上是关于Redshift 性能:连接列上的编码的主要内容,如果未能解决你的问题,请参考以下文章

我可以使用 AWS Glue 将 S3 上的 json 数据转换为列格式并将其推送到 Redshift 吗?

Redshift 中针对多个更新语句的性能调整

DatagGrip 无法识别 Redshift 特定命令

Redshift 在名为“MM”的列上失败

Redshift 终止长时间运行的查询

尝试使用 node-redshift 从节点连接到 redshift 时超时