我是 Redshift 新手,我在 Oracle 中使用过 B 树和 bitmpa 索引。
我们有很多星型模式的表。事实表具有多个维度表的 fk 列。 我们有一个维度表,我们经常在Oracle的where子句中使用一列PART_NuMBER。 基数列非常高,几乎所有值都是唯一的。我们也会在 Redshift 中这样做。所以我认为这一列应该是一个很好的排序键。该表将与事实表连接。因此,要使用最有效的合并连接,事实的 fk 和维度的 pk 应该是 distkey 和 sort key。 如果我将 pk 定义为排序键,则列 part_number 将不是我的主要排序键,可以在 where 子句中高效地用作谓词。在这种情况下,将对表进行全面扫描以查找一个值,还是我错了?
这种情况下的最佳实践是什么? 事实表有许多其他维度的 fk 列,因此可以在复合键中定义另一个列,但在连接到另一个维度时将使用 Marge join?
我有点困惑。 在 Oracle 中,可以为许多列定义位图,并且 where 子句中谓词的顺序并不重要。
这篇文章中似乎有很多问题需要解决,但让我直接谈谈可能的答案。
我怀疑您需要将暗淡表定义为 DISTSTYLE ALL 并按零件号排序。根据暗表大小执行此操作有一些限制,具体取决于集群大小/节点类型。除非你的暗表在大小上占事实表的很大一部分,否则你最好采用这种方式。
WHERE 谓词的顺序并不重要,但表中复合排序键的顺序却很重要。我怀疑你把这些因素混合在一起了。这都是为了从每个桌子的区域地图中获得最大价值。
对于事实表,您将需要一组排序键,以便根据元数据很好地拒绝块。这通常不是暗淡的问题,但可以是。通常,日期或时间戳作为事实的排序键很重要,但取决于您的查询模式。通过对查询数据进行一些来回操作来优化此操作。