presto sql语句优化

写高效sql语句,效率瞬间提升

1.避免使用函数转换,如to_char
高效写法:
select ... from ... where time=cast('20190101' as date)
低效写法:
select ... from ... where to_char(time,'yyyymmdd')='20190101'
经过测试,第一种比第二种执行时间少一半

2.group by 中字段顺序按选择性高低排序
高效写法:
select ... from ... group by id,sex
低效写法:
select ... from ... group by sex,id

3.order by 与limit搭配使用

4.使用正则函数取代多个like
高效写法:
select ... from ... where regexp_like(method,'get|post|put')
低效写法:
select ... from ... where method like '%get%' or method like '%post%' or method like '%put%'

5.row_number() over 提高效率用法
由于presto对执行计划的推断存在误差,取数一定要在where条件后加上:where (rn=1 or rand()<0)以得到高效的执行计划。
原理:如果不加or rand()<0 ,presto的执行计划中使用的是TopNRowNumberOperator执行器,效率很低下,加上以后会在不影响执行结果的同时,诱导Presto选择Window执行器,调高执行效率。

6.分区表的查询尽量带上分区字段进行过滤

 

 

帮分析师改sql,遇到如下问题:

1.min,max函数比较两个字段
错误写法:min(a,b)
正确写法:case when a

2.select * 问题
只用到几个字段,应该一一列出,不能用*,尤其*代表字段特别多的时候。

3.语法问题,笛卡尔积--怎么都跑不出来
select id
from test1 a 
inner test2 b on a.id=b.id
inner test3 c on b.id=b.id

4.用中文当别名建表失败
create table test as select amount as "金额" from loan;
会报一个这样的错:
Query 20190911_072027_10761_d8e6m failed: Add request failed : INSERT INTO `COLUMNS_V2` (`CD_ID`,`COMMENT`,`COLUMN_NAME`,`TYPE_NAME`,`INTEGER_IDX`) VALUES (?,?,?,?,?)
解决:将中文别名改成英文即可

你可能感兴趣的:(presto,#,sql)