left semi join 和 left join 区别
目录
left semi join 和 left join 有啥区别呢?
使用对比
a表数据
|
|
b表数据
|
|
left join
|
|
如图所示:a 表和 b 表所有的字段都会展示出来
left semi join
|
|
如图所示:只能展示 a 表的字段,因为 left semi join 只传递表的 join key 给 map 阶段
in
|
|
如图所示:发现效果和 left semi join 是一样的
inner join
|
|
如图所示:不会对 b 表有去重操作,会一直遍历
总结
LEFT SEMI JOIN是 IN/EXISTS 的一种更高效的实现。LEFT SEMI JOIN的限制是,JOIN子句中右边的表只能在ON子句中设置过滤条件,在WHERE子句、SELECT子句或其他地方都不行。- 因为
left semi join是in(keySet)的关系,遇到右表重复记录,左表会跳过,而join则会一直遍历。这就导致右表有重复值得情况下left semi join只产生一条,join所以left semi join的性能更高。 left semi join是只传递表的join key给map阶段,因此left semi join中最后select的结果只许出现左表。因为右表只有join key参与关联计算了,而left join默认是整个关系模型都参与计算了。