Amazon redshift 红移:是否需要使用外键来利用分发密钥?

Amazon redshift 红移:是否需要使用外键来利用分发密钥?,amazon-redshift,Amazon Redshift,在Amazon的指南中,他们提到为所有表指定主键和外键,然后在有意义的地方指定分发键,比如通常用于将表连接在一起的列上。我知道,即使使用单个表查询,正确的DISTKEY规范也有助于执行分组方式,但是对于连接两个或多个表,DISTKEY列也必须指定为外键吗?或者红移会根据用作DISTKEY的列的数据类型(可能还有名称)将不同表中的行共同定位到相同的节点吗 我问这个问题的原因是因为我没有在我的应用程序中真正使用维度表。我可以创建它们只是为了用作外键引用来帮助分发,但随后必须维护维度表 考虑以下示例,

在Amazon的指南中,他们提到为所有表指定主键和外键,然后在有意义的地方指定分发键,比如通常用于将表连接在一起的列上。我知道,即使使用单个表查询,正确的DISTKEY规范也有助于执行分组方式,但是对于连接两个或多个表,DISTKEY列也必须指定为外键吗?或者红移会根据用作DISTKEY的列的数据类型(可能还有名称)将不同表中的行共同定位到相同的节点吗

我问这个问题的原因是因为我没有在我的应用程序中真正使用维度表。我可以创建它们只是为了用作外键引用来帮助分发,但随后必须维护维度表

考虑以下示例,其中我有两个经常连接的表:

CREATE TABLE motorcycles
(
  id INT,
  hexcolor CHAR(6)
);

CREATE TABLE helmets
(
  id INT,
  hexcolor CHAR(6)
);
现在假设在我的应用程序中,我们经常在hexcolor列中将摩托车表与头盔表连接起来。那么使用
DISTSTYLE键
DISTKEY(hexcolor)
是有意义的,对吗?但是,您不能说摩托车表中的hexcolor列是helmets表的外键,反之亦然。我可以创建一个包含所有可能的hexcolor值的维度表,然后摩托车和头盔表都可以有一个外键指向这个维度表,但是维护这个维度表是一件痛苦的事情(亚马逊指南还警告不要指定未正确维护的主键或外键,因为这会混淆查询计划器)


那么,以我的摩托车和头盔为例,是否需要维度表的外键?或者Redshift是否会假设,它应该基于用作分发键的列的数据类型相同的事实,以相同的方式分发这两个表的行?

,只要列具有相同的数据类型ata类型,您应该期望Redshift以相同的方式分发摩托车和头盔表

在您的情况下,没有理由使用外键。查询计划器将能够利用表由同一个键分布这一事实


但是,阅读执行计划并确保上面写着DS_DIST_NONE总是很好的,这意味着不需要重新分配数据。

列名是什么重要吗?不重要的是列名是什么。只需添加一个不相关的2¢就可以将hexcolor转换为24/32位整数并存储。这会很快r和占用更少的磁盘空间。我的真实场景与颜色或摩托车无关。我只是想给出一个对大多数人都有意义的示例。:)