大表關聯小表
當一個大表和一個或多個小表做join時,可以使用mapjoin,性能比普通的join要快很多。
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,則所有小表占用的內存總和不得超過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;
ODPS 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;