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...