當一個大表和一個或多個小表做Join時,可以使用MapJoin,效能比普通的Join要快很多。MapJoin 的基本原理為:在小資料量情況下,SQL會將您指定的小表全部載入到執行Join操作的程式的記憶體中,從而加快Join的執行速度。
说明 當您使用 MapJoin 時,要注意以下問題:
  • left outer join的左表必須是大表。
  • right outer join的右表必須是大表。
  • inner join左表或右表均可以作為大表。
  • full outer join不能使用MapJoin。
  • MapJoin支援小表為子查詢。
  • 使用MapJoin時,需要引用小表或是子查詢時,需要引用別名。
  • 在MapJoin中,可以使用不等值串連或者使用or串連多個條件。
  • 目前,MaxCompute在MapJoin中最多支援指定8張小表,否則報語法錯誤。
  • 如果使用MapJoin,則所有小表佔用的記憶體總和不得超過512MB。由於MaxCompute是壓縮儲存,因此小表在被載入到記憶體後,資料大小會急劇膨脹。此處的512MB限制是載入到記憶體後的空間大小。
  • 多個表Join時,最左邊的兩個表不能同時是MapJoin的表。
樣本如下:
select /* + mapjoin(a) */
        a.shop_name,
        b.customer_id,
        b.total_price
    from shop a join sale_detail b
    on a.shop_name = b.shop_name;

MaxCompute SQL不支援在普通Join的on條件中使用不等值運算式,or邏輯等複雜的Join條件,但是在MapJoin中可以進行如上操作。

樣本如下:
select /*+ mapjoin(a) */
        a.total_price,
        b.total_price
    from shop a join sale_detail b
    on a.total_price < b.total_price or a.total_price + b.total_price < 500;