连接的 Redshift 排序键

Posted

技术标签:

【中文标题】连接的 Redshift 排序键【英文标题】:Redshift Sort Keys For Joins 【发布时间】:2018-10-30 09:09:33 【问题描述】:

我已经阅读了各种帖子,但仍然不清楚。使用星型模式,我认为如果我从维度表(例如 d_article)驱动查询,我最终会得到一组用于查询/探测主要事实表的 SK(sk_article)。因此,在该暗表的 Where 子句中常​​用的字段上设置排序键是有意义的。

接下来...这是我找不到示例或答案的内容...我应该在事实表的排序键中包含 sk_article 吗?更具体地说,我是否应该使用所有不同的 SK 创建一个交错排序键,因为我们并不总是使用相同的键来加入事实表?

我没有看到仅提及在联接中包含排序键。

https://docs.aws.amazon.com/redshift/latest/dg/c_best-practices-sort-key.html

Amazon Redshift Foreign Keys - Sort or Interleaved Keys

【问题讨论】:

【参考方案1】:

红移排序键

排序键仅用于排序目的,而不是用于连接目的。可以有多个列定义为排序键。可以使用这些列对存储在表中的数据进行排序。查询优化器在确定最佳查询计划时使用此排序有序表。

另外,正如托尼所说,

排序键主要用于优化区域地图的有效性(有点像 BRIN 索引)并启用范围限制扫描。它们在大多数维度表上并不是很有用,因为维度表通常很小。排序键唯一可以帮助提高连接性能的情况是,如果您为合并连接设置了所有内容 - 这通常只对大型事实到事实表连接有意义。交错键更像是一种特殊情况的排序键,对任何连接都没有帮助。

每种类型的键都有特定的用途。 This 可能适合您阅读。

对于联接表、事实表和维度表,您应该使用分布键。

Redshift 分发密钥(DIST 密钥)

它决定了数据在 Redshift 中的存储位置。集群从根本上跨计算节点存储数据。当大量数据存储在单个节点上时,查询性能会受到影响。 Here 非常适合您阅读。

我希望这能回答你的问题。

我很好 video 会话在这里,可能对理解 SORT VS DIST Key 很有帮助。

【讨论】:

"排序键仅用于排序目的,不用于连接目的。" >>是的,但我们仍在调查事实表中的记录子集。为什么不使用从 dim 表中检索到的 SK 来过滤事实表中的记录?我的意思是,如果我取出这些 SK 的列表并将它们放入事实表的 Where 子句中而不进行连接,那么在该 SK 列上有一个排序键会加快检索速度,对吗? 到那时是的,它会有所帮助,因为该列已排序,因此会加快速度,但主要目的是排序。虽然分配键确实对联接有技巧,但您必须为暗表正确分配数据,以最大限度地减少 Redshift 在执行联接查询时将数据从一个节点移动到另一个节点。 是的,我了解使用分发密钥的重要性。但就排序键而言,听起来像是在我的事实表中的 SK 字段上放置交错排序键应该加快速度(理论上)? 排序键主要用于优化区域地图的有效性(有点像 BRIN 索引)并启用范围限制扫描。它们在大多数维度表上并不是很有用,因为维度表通常很小。排序键唯一可以帮助提高连接性能的情况是,如果您为合并连接设置了所有内容 - 这通常只对大型事实到事实表连接有意义。交错键更像是一种特殊情况的排序键,对任何连接都没有帮助。 @TonyGibbs 谢谢你的意见。是的,我同意你的观点,编辑我的答案并添加这些额外信息。

以上是关于连接的 Redshift 排序键的主要内容,如果未能解决你的问题,请参考以下文章

Redshift Dist 键、IDentity 列或连接列?列的基数,用于排序键的联接考虑

在 Redshift 中使用连接的最佳方式

Redshift join 与 varchar(40) 和 23 亿行

Redshift 数据库中维度表的排序和分布键选择

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

Redshift:当源表中有自动排序键时,创建表失败