sql-優化-大表關聯小表


大表關聯小表

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM