map join 的定义:
map join 适用于一个大表和一个或多个小表执行join操作的场景。整个join过程包含map、shuffle和reduce三个阶段。通常情况下,join操作在reduce阶段执行表连接。map join操作是在map阶段执行的,大量缩短了数据传输的时间,提升了系统资源的利用率,从而起到了优化作业的作用。并且map join会将指定的小表全部加载到执行join操作的程序的内存中,从而加快join的速度。
map join 的操作限制:
-
指定的表只能是小表;
-
表被加载到内存后占用的总内存不得超过512MB;
-
最多支持指定128张小表;
map join 中 join 操作的限制:
-
left outer join 的左表必须是大表;
-
right outer join的右表必须是大表;
-
不支持full outer join;
-
inner join的左表或右表均可以是大表;
使用方法:
-
map join语句必须使用/*+ mapjoin(<table_name>) */格式才会执行;
-
引用小表或查询时,需要引用别名;
-
支持小表为子查询;
-
可以使用不等值连接或or连接多个条件。可以通过不写on语句而通过mapjoin on 1=1的形式,实现笛卡尔乘积的计算。例如 select /*+ mapjoin(a) */ a.id from shop a join table_name b on 1=1;,但此操作可能带来数据膨胀问题;
-
map join多个小表用英文逗号(,)分隔,例如/*+mapjoin(a,b,c)*/。
使用示例:
select /*+ mapjoin(a)*/
a.name,
a.value,
b.value
from table1 a join table2 b
on a.value<b.value or a.value+b.value<500;
版权声明:本文为weixin_39918388原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。