map join 大表和小表的join

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 版权协议,转载请附上原文出处链接和本声明。