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

Posted

技术标签:

【中文标题】Redshift 数据库中维度表的排序和分布键选择【英文标题】:Sort & Dist keys selection for a dimension table in Redshift database 【发布时间】:2019-04-05 15:30:22 【问题描述】:

在 Redshift 数据库中,我想在代理键和自然主键之间确定维度表的排序键。定义说“在过滤、排序或分组数据时,应根据最常用的列选择排序键”。 我的问题是 -

我有一个带有 (Emp_key,Emp_Id,Emp_name) 的 Employee 表,并且该表在 Emp 键上连接到 Fact 表。这里“Emp_key”是代理键,“Emp_id”是自然主键。我过滤了 Emp_id 上的查询,但事实表中的“Emp_key”被定义为“dist 键”,并读取了对于一个大维度,在连接键上定义排序和 dist 键会产生更好的性能,所以我想知道哪个我应该在 Emp_key 和 Emp_id 之间选择一个维度表中的排序键吗?

另外,另一个困惑是在“date_key”之间为“date”维度表选择排序或忽略定义排序键。

感谢您在这方面的建议。

谢谢!

【问题讨论】:

【参考方案1】:

您的员工表可能不包含太多行,您可以选择ALL 分布样式,因此该表的副本位于集群的每个节点上。这样您就可以以极低的成本避免这种困境。

UPD:使用这种设计,我会将 emp_key 作为 dist 键(以便连接的数据位于相同的节点上)并将 emp_id 作为排序键(以有效过滤)。我很确定查询计划器会优先考虑过滤而不是连接,所以首先它会过滤维度表中的行,然后才会连接事实表中的相应行。但最好尝试所有选项并对一些查询进行基准测试,看看哪个最有效。

如果您可以更改设计,我只需将 emp_id 添加到事实表(因为它看起来像键映射 1 到 1)作为 ELT 的一部分,并避免再次陷入困境。

【讨论】:

感谢亚历克斯的回复! Employee 表只是我提供的一个例子。但是我有一个很大的维度表,想知道在代理键和自然主键之间选择哪个键作为排序键。谢谢! 感谢亚历克斯的澄清!这有帮助!你能建议“日期”维度的最佳排序和分布样式吗?谢谢! 这是一个日期维度,并在“date_key”上加入事实表。 @varun 是的,但是使用单独的键而不是使用日期列本身作为键有什么好处? date_key 这里是一个代理键,它是整数格式,而不是按原样使用日期。这是典型的星型架构设计。

以上是关于Redshift 数据库中维度表的排序和分布键选择的主要内容,如果未能解决你的问题,请参考以下文章

更改依赖表的排序和分布

Redshift join 与 varchar(40) 和 23 亿行

是否有分配键但没有声明的外键并置表?

Redshift 不使用交错排序键执行合并连接

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

Redshift:主表的 DIST KEY 和 SORT KEY 的适当组合是啥?