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
默认是整个关系模型都参与计算了。