當一個大表和一個或多個小表做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;