连接的 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 列或连接列?列的基数,用于排序键的联接考虑