在亚马逊的指南中,他们提到为所有表指定PRIMARY和FOREIGN KEY,然后在有意义的地方指定分配键,就像通常习惯于将表连接在一起的列一样。我理解即使使用单个表查询,正确的DISTKEY规范也有助于进行GROUP BY,但是对于JOINing两个或更多表,DISTKEY列是否也必须指定为FOREIGN KEYs?或者,Redshift会根据用作DISTKEY的列的数据类型(也可能是名称)将来自不同表的行共同定位到相同的节点?
我问的原因是因为我并没有真正在我的应用程序中使用维度表。我可以创建它们只是用作外键引用来帮助分发,但是必须维护维度表。
考虑以下示例,其中我有两个经常加入的表:
CREATE TABLE motorcycles
(
id INT,
hexcolor CHAR(6)
);
CREATE TABLE helmets
(
id INT,
hexcolor CHAR(6)
);
现在假设在我的应用程序中,我们经常将 motorcycles 表加入 hexcolor 列上的 helmets 表。然后使用DISTSTYLE KEY
并使用DISTKEY (hexcolor)
是有意义的,对吧?但是,您无法确切地说 motorcycles 表中的 hexcolor 列是头盔表的外键,或者是 - 反之亦然。我可以创建一个维度表,其中只包含所有可能的 hexcolor 值的列表,然后 motorcycles 和 helmets 表都可以有一个此维度表的外键,但是必须维护此维度表会很麻烦(亚马逊的指南也警告不要指定未正确维护的主键或外键,因为它会使查询计划程序混淆)。
那么,以我的摩托车和头盔为例,是否需要维度表的外键?或者Redshift会假设它应该以相同的方式为这两个表分配行,这是基于用作分配键的列的数据类型是相同的事实?
答案 0 :(得分:4)
只要列具有相同的数据类型,您应该期望Redshift以相同的方式分发摩托车和头盔表。
在您的情况下,没有理由使用外键。查询规划器将能够利用表由相同密钥分发的事实。
但是阅读执行计划并确保它说DS_DIST_NONE总是很好 - 这意味着不需要重新分配数据。