查询速度慢, 如何优化?
解决方法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