--join優化:在進行join的時候,大表放在最後面ide
--可是使用 /+streamtable(大表名稱)/ 來標記大表,那麼大表放在什麼位置都行了優化
select /+streamtable(s)/ s.ymd,d.dividendtable
from stocks s inner join dividends d on s.ymd=d.ymd and s.symbol=d.symbolstream
where s.symbol=’aapl’配置
把外鏈接(outer join)中where語句中的過濾條件,放在on語句是無效的。不過對於內鏈接有效。select
join的時候不使用on,而使用where的。map
--笛卡爾積join很緩慢,能夠設置hive.mapred.mode=strict來阻止執行引用
hive.mapred.mode=stricttab
左半開鏈接(left semi-join)會返回左邊表的記錄,前提是其記錄對於右邊表知足on語句中的斷定條件。di
select和where語句中都不能引用右邊表的字段。
適用場景:
由於hive不支持in...exists結構,因此要使用左半開鏈接代替.
注意點:
semi-join比inner join更高效
hive不支持右半開鏈接.
map-side join:hive能夠在map端執行鏈接過程(對於在join時有一個是小表的狀況)
使用map-side join,須要配置下: (1)hive0.7版本以前,須要加/*+ mapjoin(表名) */
select /*+ mapjoin(d) */ s.ymd,d.dividend from stocks s join dividends d
on s.ymd=d.ymd and s.symbol=d.symbol
where s.symbol=’AAPL (2)hive0.7版本開始,設置hive.auto.convert.join=true
hive.auto.convert.join=true
hive.mapjoin.smalltable.filsize=25000000 --使用這個優化的小表的大小(單位:字節)--注意:右外鏈接和全外鏈接不支持這個優化
備註:
(1). hive的join語句,只支持等值鏈接。 (2). 注:pig提供的交叉生成功能支持「非等值鏈接」. (3). hive目前不支持在join 的on子句中使用or。