天天看點

MaxCompute優化系列-如何使用`MAPJOIN` ?

當一個大表和一個或多個小表做JOIN時,最好使用MAPJOIN,性能比普通的JOIN要快很多。 另外,MAPJOIN 還能解決資料傾斜的問題。 MAPJOIN的基本原理是:在小資料量情況下,SQL會将使用者指定的小表全部加載到執行JOIN操作的程式的記憶體中,進而加快JOIN的執行速度。 使用MAPJOIN時,需要注意: LEFT OUTER JOIN的左表必須是大表; RIGHT OUTER JOIN的右表必須是大表; INNER JOIN左表或右表均可以作為大表; FULL OUTER JOIN不能使用MAPJOIN; MAPJOIN支援小表為子查詢; 使用MAPJOIN時需要引用小表或是子查詢時,需要引用别名; 在MAPJOIN中,可以使用不等值連接配接或者使用OR連接配接多個條件; 目前ODPS在MAPJOIN中最多支援指定6張小表,否則報文法錯誤; 如果使用MAPJOIN,則所有小表占用的記憶體總和不得超過512M(解壓後的邏輯資料量)。
同時滿足下面2個條件: 1) Join階段 max(join instance 運作時間) > 10分鐘 && max( join instance 運作時間 ) > 2 * avg( join instance 運作時間 ) 2) 參與join 的最小表資料量小于100M (解壓前的邏輯資料量)
set odps.sql.mapjoin.memory.max=512 設定mapjoin時小表的最大記憶體,預設512,機關M,[128,2048]之間調整
這個例子比較綜合,既涉及到了資料傾斜問題,又涉及到當“小表”不是很小時(>512M)如何利用mapjoin. 場景:

日志表(log)通常來說是記錄數比較多的,但使用者表(users)也不小,600W+ 的記錄,把 users 分發到所有的 map 上也是個不小的開銷,而且 map join 不支援這麼大的小表。如果用普通的 join,又會碰到資料傾斜的問題。 解決方法:

MaxCompute優化系列-如何使用`MAPJOIN` ?

繼續閱讀