以下为需要mapjoin相关治理项的处理指导。
关联治理项:DG-D-76
当一个大表和一个或多个小表做JOIN时,最好使用MAPJOIN,性能比普通的JOIN要快很多。另外,使用MAPJOIN还能解决部分数据倾斜的问题。 MAPJOIN的基本原理是:在小数据量情况下,SQL会将用户指定的小表全部加载到执行JOIN操作的程序的内存中,从而加快JOIN的执行速度。
适用数据源
MaxCompute
规则判断
MaxCompute SQL在JOIN执行阶段,会将JOIN KEY相同的数据,分发到同一个执行instance上处理。如果某个KEY上的数据量比较多,会导致该instance执行时间比其他instance执行时间长。其表现为:执行日志中该Join Task的大部分Instance都已执行完成,但少数几个Instance一直处于执行中,这种现象称之为长尾。 针对任务执行日志记录,如同时满足下面2个条件,则判断是可进行MAPJOIN使用以避免长尾现象。
任务JOIN阶段:max(join instance 运行时间)>10分钟 && max(join instance 运行时间)> 2 * avg(join instance 运行时间)。
参与JOIN的最小表数据量小于100M(解压前的逻辑数据量)。
处理指南
将原有大小表JOIN的语句,改写成MAPJOIN联接。具体使用方法可参考MAPJOIN HINT。
注意事项
mapjoin操作的使用限制如下:
mapjoin在Map阶段会将指定表的数据全部加载在内存中,因此指定的表仅能为小表,且表被加载到内存后占用的总内存不得超过512 MB。由于MaxCompute是压缩存储,因此小表在被加载到内存后,数据大小会急剧膨胀。此处的512 MB是指加载到内存后的空间大小。
mapjoin中join操作的限制如下:
left outer join的左表必须是大表。
right outer join的右表必须是大表。
不支持full outer join。
inner join的左表或右表均可以是大表。
mapjoin最多支持指定128张小表,否则报语法错误。