Presto優化之數據存儲
- 合理設置分區
與Hive類似,Presto會根據元數據信息讀取分區數據,合理的分區能減少Presto數據讀取量,提升查詢性能。
- 使用列式存儲
Presto對ORC文件讀取做了特定優化,因此在Hive中創建Presto使用的表時,建議採用ORC格式存儲。相對於Parquet,Presto對ORC支持更好。
- 使用壓縮
數據壓縮可以減少節點間數據傳輸對IO帶寬壓力,對於即席查詢需要快速解壓,建議採用Snappy壓縮。
Presto優化之查詢SQL
- 只選擇使用的字段
由於採用列式存儲,選擇需要的字段可加快字段的讀取、減少數據量。避免採用*讀取所有字段。
- 過濾條件必須加上分區字段
對於有分區的表,where語句中優先使用分區字段進行過濾。acct_day是分區字段,visit_time是具體訪問時間。
- Group By語句優化
合理安排Group by語句中字段順序對性能有一定提升。將Group By語句中字段按照每個字段distinct數據多少進行降序排列。
Order by時使用Limit
- Order by需要掃描數據到單個worker節點進行排序,導致單個worker需要大量內存。如果是查詢Top N或者Bottom N,使用limit可減少排序計算和內存壓力。
- 使用Join語句時將大表放在左邊 (這裏跟hive有差異)
Presto中join的默認算法是broadcast join,即將join左邊的表分割到多個worker,然後將join右邊的表數據整個複製一份發送到每個worker進行計算。如果右邊的表數據量太大,則可能會報內存溢出錯誤。
注意事項
- 字段名引用
避免和關鍵字衝突:MySQL對字段加反引號`、Presto對字段加雙引號分割
當然,如果字段名稱不是關鍵字,可以不加這個雙引號。
- 時間函數
對於Timestamp,需要進行比較的時候,需要添加Timestamp關鍵字,而MySQL中對Timestamp可以直接進行比較。
SELECT t FROM a WHERE t > '2017-01-01 00:00:00';
SELECT t FROM a WHERE t > timestamp '2017-01-01 00:00:00';
- 不支持INSERT OVERWRITE語法
Presto中不支持insert overwrite語法,只能先delete,然後insert into。
- PARQUET格式
Presto目前支持Parquet格式,支持查詢,但不支持insert。