presto sql 报错_使用Presto SQL一些常见问题总结

查询速度慢, 如何优化?

解决方法1: 避免单节点处理

虽然Presto是分布式查询引擎, 但是一些操作是必须在单节点中处理的. 例如:

count(distinct x)

考虑使用approx_distinct(x)代替

但是需要注意这个函数有个大约在2.3%的标准误差, 如果需要精确统计的情况, 请绕道.

UNION

UNION有个功能是: 如果两条记录一样, 会只保留一条记录(去重).

如果不考虑去重的情况, 请使用UNION ALL

ORDER BY

Presto对数据排序是作用在单节点上的

如果要排序的数据量超过百万行, 要谨慎考虑. 如果非要排序,尽量将排序的字段减少些.

解决方法2: 减少表扫描的范围

通过添加条件达到减少表扫描的范围.

也可以考虑将大数据量的表, 水平查分, 通过查不同的表分区达到效果.

解决方法3: 避免使用 SELECT * FROM

要明确写出所有要访问的列, 能加快速度.

例如

SELECT * FROM my_table

改成:

SELECT id, name, address FROM my_table

解决方法4: 将几个LIKE语句放到函数regexp_like()

Presto的查询优化器不能改善许多LIKE语句使用的地方, 导致这样的语句查询速度慢.

例如

SELECT

...

FROM

access

WHERE

method LIKE '%GET%' OR

method LIKE '%POST%' OR

method LIKE '%PUT%' OR

method LIKE '%DELETE%'

上面的语句能用regexp_like函数优化成一句

SELECT

...

FROM

access

WHERE

regexp_like(method, 'GET|POST|PUT|DELETE')

如何优化JOIN性能?

尽量让JOIN的条件简单,最好是ON后面的比较表达式两边必涉及计算。

例如

SELECT a.date, b.name FROM

left_table a

JOIN right_table b

ON a.date = CAST((b.year * 10000 + b.month * 100 + b.day) as VARCHAR)

上面的SQL语句的JOIN性能不高,因为JION条件包含了表达式计算。我们可以通过子查询的形式来优化上面的语句。

SELECT a.date, b

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值