我正在查看我在Redshift中所做的一些查询的性能,并注意到我在文档中找不到的东西。
我创建了两个表之间有连接键的表(子表中大约10K行)。
对于父表,我们称之为A,我有一个主键,我已声明它是表的distkey和sort键。我们称之为id。
对于子表B,我创建了一个引用A.id的外键字段parent_id。 parent_id已被声明为表B的distkey。表B还有一个我定义的主键id。我在表B上为(parent_id,id)创建了一个交错排序键。
当我尝试解释加入这两个表时,我总是会得到一个Hash Join。如果我使用普通的复合排序键重新创建表B,我将始终获得合并连接。
当我查看表格的统计数据时,我没有看到任何偏离的偏差。
我的问题是,Redshift总是会使用Hash Joins和交错排序键吗?还是我做错了什么?
编辑 - 表B中交错排序键的顺序实际上是(parent_id,id)。我上面写的不正确。我现在已经更新了以上内容。
答案 0 :(得分:2)
根据我的理解:
正如您所指出的,如果使用普通复合键对表进行排序,则两个表都按连接列排序。
但是,在交错联接中,每列中的值无法保证排序。
Interleaved Keys的文档说:
交错排序为排序键中的每列或列子集提供相同的权重。如果多个查询对筛选器使用不同的列,则通常可以使用交错排序样式来提高这些查询的性能。当查询在辅助排序列上使用限制性谓词时,与复合排序相比,交叉排序可显着提高查询性能。
但是,不意味着所有列都已排序(因为它们是使用复合排序)。相反,它提供了通常良好的混合排序,因此任何列上的排序通常都能正常工作。因此,每列不一定完全排序,因此需要哈希联接。
博文Quickly Filter Data in Amazon Redshift Using Interleaved Sorting尝试解释使用交错排序时数据的存储方式。