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 数据库中维度表的排序和分布键选择的主要内容,如果未能解决你的问题,请参考以下文章