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

时间:2017-02-15 16:58:49

标签: amazon-redshift

我正在查看我在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)。我上面写的不正确。我现在已经更新了以上内容。

1 个答案:

答案 0 :(得分:2)

根据我的理解:

  • 当两个表在连接列上排序时,可以使用合并连接,这非常有效 - 有点像关闭拉链,其中双方都适合" ;彼此。
  • 散列连接效率较低,因为它需要通过散列进行查找以查找匹配值。

正如您所指出的,如果使用普通复合键对表进行排序,则两个表都按连接列排序。

但是,在交错联接中,每列中的值无法保证排序

Interleaved Keys的文档说:

  

交错排序为排序键中的每列或列子集提供相同的权重。如果多个查询对筛选器使用不同的列,则通常可以使用交错排序样式来提高这些查询的性能。当查询在辅助排序列上使用限制性谓词时,与复合排序相比,交叉排序可显着提高查询性能。

但是,意味着所有列都已排序(因为它们是使用复合排序)。相反,它提供了通常良好的混合排序,因此任何列上的排序通常都能正常工作。因此,每列不一定完全排序,因此需要哈希联接

博文Quickly Filter Data in Amazon Redshift Using Interleaved Sorting尝试解释使用交错排序时数据的存储方式。