1. 程式人生 > 資料庫 >Presto優化之查詢SQL

Presto優化之查詢SQL

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