Presto優化之查詢SQL
阿新 • • 發佈:2021-01-17
Presto優化之查詢SQL
1. 只選擇使用的欄位
由於採用列式儲存,選擇需要的欄位可加快欄位的讀取、減少資料量。避免採用*讀取所有欄位。
[GOOD]: SELECT time, user, host FROM tbl
[BAD]: SELECT * FROM tbl
2. 過濾條件必須加上分割槽欄位
對於有分割槽的表,where語句中優先使用分割槽欄位進行過濾。acct_day是分割槽欄位,visit_time是具體訪問時間。
[GOOD]: SELECT time, user, host FROM tbl where acct_day=20171101 [BAD]: SELECT * FROM tbl where visit_time=20171101
3. Group By語句優化
合理安排Group by語句中欄位順序對效能有一定提升。將Group By語句中欄位按照每個欄位distinct資料多少進行降序排列。
[GOOD]: SELECT GROUP BY uid, gender
[BAD]: SELECT GROUP BY gender, uid
4. Order by時使用Limit
Order by需要掃描資料到單個worker節點進行排序,導致單個worker需要大量記憶體。如果是查詢Top N或者Bottom N,使用limit可減少排序計算和記憶體壓力。
[GOOD]: SELECT * FROM tbl ORDER BY time LIMIT 100 [BAD]: SELECT * FROM tbl ORDER BY time
5. 使用Join語句時將大表放在左邊
Presto中join的預設演算法是broadcast join,即將join左邊的表分割到多個worker,然後將join右邊的表資料整個複製一份傳送到每個worker進行計算。如果右邊的表資料量太大,則可能會報記憶體溢位錯誤。
[GOOD] SELECT ... FROM large_table l join small_table s on l.id = s.id
[BAD] SELECT ... FROM small_table s join large_table l on l.id = s.id