Presto查詢優化

2021-08-17 16:10:10 字數 4276 閱讀 7513

合理設定分割槽

與hive類似,presto會根據元資訊讀取分割槽資料,合理的分割槽能減少presto資料讀取量,提公升查詢效能。

使用列式儲存

presto對orc檔案讀取做了特定優化,因此在hive中建立presto使用的表時,建議採用orc格式儲存。相對於parquet,presto對orc支援更好。

使用壓縮預先排序

對於已經排序的資料,在查詢的資料過濾階段,orc格式支援跳過讀取不必要的資料。比如對於經常需要過濾的字段可以預先排序。

insert into table nation_orc partition

(p) select * from nation sort by n_name;

如果需要過濾n_name欄位,則效能將提公升。

select count

(*) from nation_orc where n_name=』australia』;

只選擇使用必要的字段

由於採用列式儲存,選擇需要的字段可加快欄位的讀取、減少資料量。避免採用*讀取所有字段。

[good]: select

time,user,host

from

tbl[bad]: select * from

tbl

過濾條件必須加上分割槽字段

對於有分割槽的表,where語句中優先使用分割槽字段進行過濾。acct_day是分割槽字段,visit_time是具體訪問時間

[good]: select time,user,host from tbl where acct_day=20171101

[bad]: select * from tbl where visit_time=20171101

group by語句優化

合理安排group by語句中欄位順序對效能有一定提公升。將group by語句中欄位按照每個欄位distinct資料多少進行降序排列。

[good]: select

group

byuid, gender

[bad]: select

group

bygender, uid

order by時使用limit

order by需要掃瞄資料到單個worker節點進行排序,導致單個worker需要大量記憶體。如果是查詢top n或者bottom n,使用limit可減少排序計算和記憶體壓力。

[good]: select * from

tblorder

bytime

limit 100

[bad]: select * from

tblorder

bytime

使用近似聚合函式

用regexp_like代替多個like語句

presto查詢優化器沒有對多個like語句進行優化,使用regexp_like對效能有較大提公升

[good]

select

...from

access

where

regexp_like(method, 'get|post|put|delete')

[bad]

select

...from

access

where

method like '%get%'

or method like '%post%'

or method like '%put%'

or method like '%delete%'

使用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

使用rank函式代替row_number函式來獲取top n

在進行一些分組排序場景時,使用rank函式效能更好

[good]

select checksum

(rnk)

from

( select rank()

over

(partition by l_orderkey, l_partkey order by l_shipdate desc) as rnk

from lineitem

) twhere rnk = 1

[bad]

select checksum

(rnk)

from

( select row_number()

over

(partition by l_orderkey, l_partkey order by l_shipdate desc) as rnk

from lineitem

) twhere rnk = 1

create table bdc_dm.res_category(

channel_id1 int comment '1級渠道id',

province string comment '省',

city string comment '市',

uv int comment 'uv'

)comment 'example'

partitioned by (landing_date int comment '日期:yyyymmdd')

row format delimited fields terminated by '\t' collection items terminated by ',' map keys terminated by ':' lines terminated by '\n';

建立對應的orc表

create table bdc_dm.res_category_orc(

channel_id1 int comment '1級渠道id',

province string comment '省',

city string comment '市',

uv int comment 'uv'

)comment 'example'

partitioned by

(landing_date int comment '日期:yyyymmdd')

row format delimited fields terminated by '\t'

stored as orc

tblproperties

;

先將資料灌入orc表,然後更換表名

insert overwrite table bdc_dm.res_category_orc partition(landing_date)

select * from bdc_dm.res_category where landing_date >= 20171001;

alter table bdc_dm.res_category rename to bdc_dm.res_category_tmp;

alter table bdc_dm.res_category_orc rename to bdc_dm.res_category;

其中res_category_tmp是乙個備份表,若線上執行一段時間後沒有出現問題,則可以刪除該錶。

orc和parquet都支援列式儲存,但是orc對presto支援更好(parquet對impala支援更好)

對於列式儲存而言,儲存檔案為二進位制的,對於經常增刪欄位的表,建議不要使用列式儲存(修改檔案元資料代價大)。對比資料倉儲,dwd層建議不要使用orc,而dm層則建議使用

資料查詢 Presto

目錄 1 基本原理 2 軟體安裝 3 命令 簡介 presto是一款基於記憶體的平行計算的分布式sql互動式查詢引擎.其查詢原理是不把資料全部放到記憶體,只是在計算中拿出一部分放在記憶體 計算 丟擲 再拿.它具有支援多資料來源 支援sql 支援擴充套件 可以自己擴充套件新的connector 支援混...

Presto(4)presto客戶端查詢儲存成檔案

因為沒有把前面的整理出來,所以就先把後邊presto要寫的知識點寫一下。對於想實現類似於hive e 或者是hive f 的功能,之後重定向查詢的檔案中這種功能,presto當然也提供了。可以想象presto為快速版的hive,對於想要快速的出資料非常有效 當然對於大資料表的join支援不是很好,但...

Presto查詢hive欄位為json型別的方法

針對樣例資料做示例說明 hive employee表的xjson欄位,只有一條資料 select get json object xjson,0 age from employee limit 1 presto 我們分步操作,先用 json array get 取出jsonarray的第乙個元素 s...