WHERE 和 ON 子句如何与 AWS Redshift 中的联接一起使用?

How do WHERE and ON clauses work with joins in AWS Redshift?

以下两个连接在 AWS Redshift 中的性能是否相同?

加入 1

Select col_a, col_b
from table_1 
inner join table_2 on table_1.key1 = table_2.key2
where table_2.col_b = 'Y';

加入 2

Select col_a, col_b
from table_1 
inner join table_2 on table_1.key1 = table_2.key2 and table_2.col_b = 'Y';   

他们应该如此简单,我希望如此。但是,Redshift 根据情况使用了多个查询优化器,每个查询优化器都有自己的优势,因此在某些(复杂的)情况下我可以看到不同的东西。

最大的性能提升是将“table_2.col_b = 'Y'”用作“范围限制扫描”标准。这是当 Redshift 使用 WHERE 语句进行块元数据比较以限制扫描的 table 数据量时。 ON 子句中列与常量的这种简单比较应该被优化器识别为 WHERE 子句并用于限制扫描。您可以在 STL_SCAN 系统 table 中查找此查询,因为有一个名为“is_rrscan”的列表明使用了受限扫描。 table 元数据也需要保持最新,因此请确保 ANALYZE 已 运行.

一般来说,将连接子句放在 ON 子句中(而不是 WHERE 中)而不是 WHERE 子句中是个好主意。这提高了可读性,并阻止您受到优化器突发奇想的摆布。