由于采用列式存储,选择需要的字段可加快字段的读取、减少数据量。避免采用*读取所有字段
-- 正确的写法
SELECT id,name FROM users
-- 错误的写法
SELECT * FROM users
-- 正确的写法
select
count(1) as "记录数"
from src.log_event_flow_whole
where thedate = ‘2021-01-01‘
-- 错误的写法
select
count(1) as "记录数"
from src.log_event_flow_whole
where thedate = ‘2021-01-01‘
合理安排Group by语句中字段顺序对性能有一定提升。将Group By语句中字段按照每个字段distinct数据多少进行降序排列
-- 正确的写法
select
property_id as "类目"
,city as "城市"
,count(1) as "商家数"
from biz.hlj_db__wedding__merchants
group by property_id,city
-- 错误的写法
select
city as "城市"
,property_id as "类目"
,count(1) as "商家数"
from biz.hlj_db__wedding__merchants
group by city,property_id
order by需要扫描数据到单个worker节点进行排序,导致单个worker需要大量内存。如果是查询Top N或者Bottom N,使用limit可减少排序计算和内存压力
-- 正确的写法
SELECT id,name,city,property_id
FROM biz.hlj_db__wedding__merchants
ORDER BY city
LIMIT 100
-- 错误的写法
SELECT id,name,city,property_id
FROM biz.hlj_db__wedding__merchants
ORDER BY city
Presto有一些近似聚合函数,对于允许有少量误差的查询场景,使用这些函数对查询性能有大幅提升。比如使用approx_distinct() 函数比Count(distinct x)有大概2.3%的误差
SELECT approx_distinct(city)
FROM biz.hlj_db__wedding__merchants
Presto查询优化器没有对多个like语句进行优化,使用regexp_like对性能有较大提升
-- 正确的写法
SELECT
id,name,kind
FROM biz.hlj_db__wedding__cities
WHERE regexp_like(kind, ‘A|B|C‘)
-- 错误的写法
SELECT
id,name,kind
FROM biz.hlj_db__wedding__cities
WHERE kind like ‘%%A%%‘
OR kind like ‘%%B%%‘
OR kind like ‘%%C%%‘
Presto中join的默认算法是broadcast join,即将join左边的表分割到多个worker,然后将join右边的表数据整个复制一份发送到每个worker进行计算。如果右边的表数据量太大,则可能会报内存溢出错误
使用Rank函数代替row_number函数来获取TopN,在进行一些分组排序场景时,使用rank函数性能更好
原文:https://www.cnblogs.com/blog-for-me/p/14846362.html