SQL 性能調優---轉(數據小斑馬)這位大神的

SQL 性能調優—轉(數據小斑馬)這位大神的

原文鏈接:https://blog.csdn.net/cindy407/article/details/90679314
今天聽組內SQL小王子分享了一篇Hive Sql性能優化的總結報告,甚覺精彩,趕緊來分享給大家!!

一、儘量使用索引,避免全表查詢
① 在where 和 order by 常用的字段上創建索引,提升效率的核心!但是用不到的字段就別加索引了,反而浪費存儲空間;頻繁更新的字段也不適合創建索引
② where子句中儘量避免進行nul值判斷,少使用!=,<>等操作符,等號左邊避免函數、算數和其它表達式運算,這此操作都會導致索引無效,啓動全表查詢
③ where 子句中將in,not替換成exists和not exists,將會避免掉全表查詢,同時如果是數值用Between替代in也是很好的選擇
④ where 子句中儘量少用or,如果一定要多條件並集查詢,可以使用Union All替代OR
⑤ where子句中 LIKE 字符第1個不要是%,這樣會啓動全表查詢

二、多表關聯小技巧
①避免笛卡爾積出現,如果多表關聯,在符合業務需求情況下,能去重就都去重,比如登錄表和充值表就是多條記錄表,如果要關聯獲得登錄用戶的累計充值金額,則可以將登錄表先去重,充值表彙總,再關聯
② 多表關聯小表在前,大表在後,hive會默認第1個表納入內存,然後再對大表進行關聯計算,小表放前將會大大提升效率
③ 儘量早過濾,減少每個階段的數據量,過濾條件執行順序:關聯表中的WHERE>ON>WHERE子句,最好先將每個要關聯的表都變成子查詢語句,先用where 進行過濾,再在ON裏面進行過濾,速度不止快10倍!
④ 多表最好都用別名,並且在各子句中都用別名+字段的方式引用,會大大提升效率

三、避免數據傾斜
① 儘量少用COUNT(DISTINCT),可以用COUNT+GROUP BY,如果一定要用,可以將重複特別多的(例如NULL)先過濾掉,再單獨處理
② 選擇分佈較爲均勻的鍵作爲關聯KEY,如用戶ID,日期,不要用性別,年齡等分佈不均的字段
③ 在使用JOIN時,關聯鍵存在大量空值或者某一特殊值,如”NULL”,可以空值單獨處理,不參與關聯,或者空值或特殊值加隨機數作爲關聯鍵;不同數據類型的字段關聯,則可以轉換爲同一數據類型之後再做關聯

四、其餘優化技巧
① 任何時候都要儘量避免使用 SELECT *** ,能用列名就用列名
② 儘量不要建立臨時表**,以減少系統表資源的浪費,但如果源表實在太大,必須建臨時表時,可以用CREATE TABLE+INSERT TABLE的方式分批插入,會比僅用CREATE+TABLE要快很多
③ 子查詢會比join快,雖然並不絕對,但是絕大部分情況下都是
④ 儘量少排序,如果一定要排序可以用sort by 替換order by ,order by 是全局排序,會佔用大量的資源,sort by是局部排序,與distribute by一起使用,速度更快,但這個也要看實際需求
⑤ 儘量用Union All替代Union,因爲Union是要組合後排序去重的,Union All是直接掃描源表即可,效率更高
⑥ 儘量使用數值型字段而不是字符型字段

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章