全部产品
弹性计算 会员服务 网络 安全 移动云 数加·大数据分析及展现 数加·大数据应用 管理与监控 云通信 阿里云办公 培训与认证 更多
存储与CDN 数据库 域名与网站(万网) 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网 智能硬件
日志服务

优化查询

更新时间:2018-04-02 22:47:13

不同的query在分析时的效率是不同的,在此为您提供部分常见的优化query方式,供您参考。

  1. 尽量避免对字符串列进行GROUP BY计算
  2. GROUP BY多列时,把字典大的字段放在前面
  3. 使用估算函数
  4. 在SQL中获取需要的列,尽量不要读取所有列
  5. 非group by的列,尽量放到聚合函数中

1. 尽量避免对字符串列进行GROUP BY计算

对字符串进行GROUP BY,会导致大量的hash计算,这部分计算量往往会占据整体计算的50%以上。

例如以下两个query:

  1. * | select count(1) as pv , date_trunc('hour',__time__) as time group by time
  2. * | select count(1) as pv , from_unixtime(__time__-__time__%3600) as time group by __time__-__time__%3600

Query 1 和2达到的效果是相同的,都是计算每个小时的日志count数,但是Query 1 首先把时间转化成字符串,例如2017-12-12 00:00:00, 然后对这个字符串进行GROUP BY。 Query 2是先对时间整点值进行计算,GROUP BY计算后才会转化成字符串类型。Query 1需要对字符串进行hash操作,所以在执行效率上,Query 2更佳。

2. GROUP BY多列时,把字典大的字段放在前面

例如,province有13个,用户有1亿。

  1. 快: * | select province,uid,count(1) group by province,uid
  2. 慢: * | select province,uid,count(1) group by uid,province

3. 使用估算函数

估算函数的性能要比精确计算好很多。估算会损失一些可接受的精确度,来达到快速计算的效果。

  1. 快: * | select approx_distinct(ip)
  2. 慢: * | select count(distinct(ip))

4. 在SQL中获取需要的列,尽量不要读取所有列

获取所有列,请使用查询语法。在SQL计算时,尽量只读取需要参与计算的列,这会加快计算。

  1. : * |select a,b c
  2. :* |select *

5. 非group by的列,尽量放到聚合函数中

例如,userid,用户名,必定是一一对应的,我们只需要按照userid进行group by即可。

  1. 快: * | select userid, arbitrary(username), count(1) group by userid
  2. 慢: * | select userid, username, count(1) group by userid,username
本文导读目录