HIVE資料庫查詢優化

2021-08-14 11:10:32 字數 2989 閱讀 4446

1.join的優化

join語句在使用時,先進行join操作,再進行where語句,因此加更多where語句限制並不能加快hive資料庫的查詢速度。

mapjoin注意事項:新版本中應該先使用set hive.auto.convert.join = true; 再新增

/*+ mapjoin(b) */

由於join

操作是在

where

操作之前執行,所以當你在執行

join

時,where

條件並不能起到減少

join

資料的作用;案例:

select a.val, b.val from a left outer join b on (a.key=b.key)

where a.ds='2009-07-07' and b.ds='2009-07-07'

最好修改為:

select a.val, b.val from a 

left outer join

bon(a.key=b.key and b.ds='2009-07-07' and a.ds='2009-07-07')

stream化

join

操作的每乙個

mapred

程式中,

hive

都會把出現在

join

語句中相對靠後的表的資料

stream

化,相對靠前的變的資料快取在記憶體中。當然,也可以手動指定

stream

化的表:

select /*+ streamtable(a) */ a.val, b.val, c.val from a join b on (a.key = b.key1) join c on (c.key = b.key1)

注意事項:如果是partition欄位,則必須放到where條件中

partition的例子:查詢所有學生的資訊並將每個學生的各科成績降序排列

select t.*,row_number() over(partition by t.uname order by t.uscore desc) rm from tb_sc t;

檔案數目過多,會給 hdfs 

帶來壓力,並且會影響處理效率,可以通過合併 

map 

和 reduce 

的結果檔案來消除這樣的影響:

·hive.merge.mapfiles = true是否和並 map 

輸出檔案,預設為 

true

·hive.merge.mapredfiles = false是否合併 reduce 

輸出檔案,預設為 

false

·hive.merge.size.per.task = 256*1000*1000合併檔案的大小

通過left outer join

進行查詢

,(假設

b表中包含另外的乙個字段 

key1 

select a.key from a left outer join b on a.key=b.key where b.key1 is null

通過left semi join 

實現 in

select a.key, a.val from a left semi join b on (a.key = b.key)

left semi join 的限制:

join

條件中右邊的表只能出現在

join

條件中。

order by 實現全域性排序,乙個

reduce

實現,效率低

sort by 實現部分有序,單個

reduce

輸出的結果是有序的,效率高,通常和

distribute by

關鍵字一起使用(

distribute by關鍵字

可以指定map 

到 reduce

端的分發

key)

cluster by col1 等價於

distribute by col1 sort by col1  根據某兩個字段排序

5、行轉列

later view可用作行轉列的用法,

目前lateral view不支援有上而下的優化。如果使用where子句,查詢可能將不被編譯。解決方法見:

此時,在查詢之前執行et hive.optimize.ppd=false;

例子:pageads

。它有兩個列:pageid,adid_list:

string pageid

arrayadid_list

"front_page"

[1, 2, 3]

"contact_page"

[3, 4, 5]

select pageid, adid from pageads lateral view explode(adid_list) adtable as adid;

將輸出如下結果:

string pageid

int adid

"front_page"

1"front_page"

2"front_page"

3"contact_page"

3"contact_page"

45.count/group

可以被使用:

select adid, count(1) from pageads lateral view explode(adid_list) adtable as adid group by adid;

資料庫查詢優化

方法 1 1.對查詢進行優化,應盡量避免全表掃瞄,首先應考慮在 where 及 order by 涉及的列上建立索引。步驟閱讀 22.應盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃瞄,如 select id from t where num is...

資料庫查詢優化

本記載,用於保留面對大資料量時,查詢速率待優化,只記錄要點,具體如何操作,還需查詢 1 索引優化 通過建立合理高效的索引,提高查詢的速度.2 sql優化 根據需求,組織優化sql語句,使查詢效率達到最優,在很多情況下要考慮索引的作用 3 水平拆分 如果表的資料量增長特變塊,索引帶來的效能優化可能達到...

資料庫查詢優化

1 對查詢進行優化,應盡量避免全表掃瞄,首先應考慮在 where 及 order by 涉及的列上建立索引。2 應盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃瞄 如 select id from t where num is null 可以在nu...