hive sql 運行太慢,如何優化?
經驗不豐富的數據分析或者BI工程師往往上來就看sql,調整sql內容,其實不然。
一.業務層面
first of all, 優先了解sql反應的業務,先把業務梳理清晰,去除掉不必要的表,關聯。
這個只能泛泛而談,但確是sql優化應該最先考慮的。在有一定業務經驗後,根據實際情況進行優化。
二.每張數據表的性能
1.數據表的存儲格式,存儲硬盤(ssd or普通盤)
數據表的存儲格式可參考https://blog.csdn.net/sinat_17697111/article/details/81907185,
目前主流的存儲格式orc (列式) 和sequence(行式)。原則上orc在存儲,查詢性能上會更好。
如果使用數據表時大多數都是select *,sequence可能會比orc格式好。
存儲硬盤,如果條件允許,ssd固態硬盤肯定會比普通硬盤好。
2.數據量過大的表,是否分區,分桶
超過千萬,上億的數據量的表,而在使用時大部分只會用到其中一小部分數據,則需要考慮對該表做分區了。退一步,如果不想做分區,只是想在做join時提高性能,分桶也是不錯的選擇,分桶可以簡單理解爲和分區效果相同,但更方便的一種方法。分桶的原理和示例可參考https://blog.csdn.net/u010003835/article/details/80911215
三.sql結構
1.子查詢可否抽離
2.join太多表,一半來說,一個sql的join表個數不宜超過三到四個,太多的join
考慮拆解成多段sql
3.where條件儘量靠近主表
四.常見sql層面優化
1.Inner join 小表在前,大表在後
2.兩張表之間的關聯字段,不要有數據分佈不均。
例如:select from table a left join table b on a.id=b.id,
如果a.id90%都是0,10%是其他值,則會存在數據傾斜,需要打散處理。具體參考https://blog.csdn.net/sinat_17697111/article/details/83793663
3.