1、指定需要返回的字段

[GOOD]: SELECT time,user,host FROM tbl
[BAD]: SELECT * FROM tbl

2、合理设置分区字段

当过滤条件作用在分区字段上面时,可以减少数据扫描的范围,有效提升查询性能。

这个需要结合OLAP业务进行考虑,将常规过滤字段设置成分区字段,例如:订单时间(适用于时间范围的统计分析)、租户id(适用于多租户平台中各个租户的统计分析)等。

3、group by的时候考虑统计字段基数

字段基数:是指某字段拥有不同值的个数。例如:性别字段的基数一般是2,月份字段的基数是12。

group by的时候需要将基数大的字段放在前面

[GOOD]: SELECT GROUP BY uid, gender
[BAD]: SELECT GROUP BY gender, uid

如果group by的字段是数值型,将比字符型更节省内存使用空间。

4、order by 和 limit 配合使用(topN)

[GOOD]: SELECT * FROM tbl ORDER BY time LIMIT 100
[BAD]: SELECT * FROM tbl ORDER BY time

order by 需要将所有数据放到一个worker中进行排序,这将消耗大量的内存空间。配合limit使用将有效减小内存空间的使用,提升查询性能。

topN 可以只需使用size=N的优先级队列即可完成,这只占用非常小的内存空间。

5、使用近似统计的功能(approximate aggregate functions)

presto提供了一些近似统计的函数,这显著提高了查询统计性能。当然,这是以牺牲准确性为代价的。

例如:approx_distinct函数,我们将得到一个误差在2.3%的近似值。

SELECT
approx_distinct(user_id)
FROM
access
WHERE
TD_TIME_RANGE(time,
TD_TIME_ADD(TD_SCHEDULED_TIME(), '-1d', 'PDT'),
TD_SCHEDULED_TIME())

上面事例表示:查询前一天不同访问用户的数量(UV)。

6、使用regexp_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')

7、join的时候把大表放在左边

presto在join的时候采用的是broadcast join,意思是右边的表将全部数据send到各个worker和左边的表(每个worker持有一部分左边表的数据)进行关联查询。

例如:订单表和用户表,需要根据用户维度对订单的某些度量进行统计分析。一般情况下,订单的数据量远大于用户的数据量,因此order left join customer。

如果有10个worker,那么10个worker将各持有1/10的订单数据(假设数据分布均匀),然后将所有用户数据send到10个worker上进行join操作。

有的时候如果右边的表确实很大,那么有可能遇到“ERROR:Exceeded max memory xxGB”,这个xxGB是配置文件中指定的每次查询worker使用的最大内存空间。超过这个阈值将报这个异常信息。这种情况要不就调整参数,要不就使用“distributed hash join”。

The type of distributed join to use.

When set to PARTITIONED, presto will use hash distributed joins. When set to BROADCAST, it will broadcast the right table to all nodes in the cluster that have data from the left table.

Partitioned joins require redistributing both tables using a hash of the join key. This can be slower (sometimes substantially) than broadcast joins, but allows much larger joins. In particular broadcast joins will be faster if the right table is much smaller than the left. However, broadcast joins require that the tables on the right side of the join after filtering fit in memory on each node, whereas distributed joins only need to fit in distributed memory across all nodes.

When set to AUTOMATIC, Presto will make a cost based decision as to which distribution type is optimal. It will also consider switching the left and right inputs to the join. In AUTOMATIC mode, Presto will default to hash distributed joins if no cost could be computed, such as if the tables do not have statistics. This can also be specified on a per-query basis using the join_distribution_type session property.

参考:

1)Presto Performance Tuning Tips

2)Presto - Properties Reference

Presto 性能优化点的更多相关文章

  1. CSS3与页面布局学习总结(八)——浏览器兼容与前端性能优化

    一.浏览器兼容 1.1.概要 世界上没有任何一个浏览器是一样的,同样的代码在不一样的浏览器上运行就存在兼容性问题.不同浏览器其内核亦不尽相同,相同内核的版本不同,相同版本的内核浏览器品牌不一样,各种运 ...

  2. CSS3与页面布局学习笔记(八)——浏览器兼容性问题与前端性能优化方案

    一.浏览器兼容 1.1.概要 世界上没有任何一个浏览器是一样的,同样的代码在不一样的浏览器上运行就存在兼容性问题.不同浏览器其内核亦不尽相同,相同内核的版本不同,相同版本的内核浏览器品牌不一样,各种运 ...

  3. HTML5前端性能优化——浏览器兼容与前端性能优化

    一.浏览器兼容 1.1.概要 世界上没有任何一个浏览器是一样的,同样的代码在不一样的浏览器上运行就存在兼容性问题.不同浏览器其内核亦不尽相同,相同内核的版本不同,相同版本的内核浏览器品牌不一样,各种运 ...

  4. 01.SQLServer性能优化之----强大的文件组----分盘存储

    汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 文章内容皆自己的理解,如有不足之处欢迎指正~谢谢 前天有学弟问逆天:“逆天,有没有一种方 ...

  5. 03.SQLServer性能优化之---存储优化系列

    汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 概  述:http://www.cnblogs.com/dunitian/p/60413 ...

  6. Web性能优化:What? Why? How?

    为什么要提升web性能? Web性能黄金准则:只有10%~20%的最终用户响应时间花在了下载html文档上,其余的80%~90%时间花在了下载页面组件上. web性能对于用户体验有及其重要的影响,根据 ...

  7. Web性能优化:图片优化

    程序员都是懒孩子,想直接看自动优化的点:传送门 我自己的Blog:http://cabbit.me/web-image-optimization/ HTTP Archieve有个统计,图片内容已经占到 ...

  8. C#中那些[举手之劳]的性能优化

    隔了很久没写东西了,主要是最近比较忙,更主要的是最近比较懒...... 其实这篇很早就想写了 工作和生活中经常可以看到一些程序猿,写代码的时候只关注代码的逻辑性,而不考虑运行效率 其实这对大多数程序猿 ...

  9. JavaScript性能优化

    如今主流浏览器都在比拼JavaScript引擎的执行速度,但最终都会达到一个理论极限,即无限接近编译后程序执行速度. 这种情况下决定程序速度的另一个重要因素就是代码本身. 在这里我们会分门别类的介绍J ...

随机推荐

  1. Delphi非官方的补丁

    http://git.kngstr.com/KngStr/delphi-fixes 使用方法 方法一: 1. 拷贝需要的补丁文件到你的工程目录 2. 拷贝编译的时候缺少或错误的文件到你的工程目录 优缺 ...

  2. 网络请求————ProxyHandler实现代理ip

    from urllib import request #这个是没有使用代理的 # resp = request.urlopen('http://httpbin.org/ip') # print(res ...

  3. 聊聊pytorch中的DataLoader

    实际上pytorch在定义dataloader的时候是需要传入很多参数的,比如,number_workers, pin_memory, 以及shuffle, dataset等,其中sampler参数算 ...

  4. JS 获取图片标签和所有的图片中的src的正则表达式

    var imgReg = /<img.*?(?:>|\/>)/gi; //匹配所有img标签的正则表达式规则 var srcReg = /src=[\'\"]?([^\'\ ...

  5. 使用ueditor配置后台接口

    因为后台是java,所以针对的是jsp版本的ueditor. 工程中需要导入jsp目录lib下的jar包.如果是maven管理的工程,可以导入jar包. 上传图片的功能的话,需要后台配置正确.如果需要 ...

  6. aufac在mvc中多线程

    注册的时候 将容器放到静态变量中    xxx.IocContainer = builder.Build();            var resolver = new AutofacDepende ...

  7. python矩阵的切片(或截取)

    矩阵一般有行也有列,所以矩阵的截取也需要包含行和列两个参数. 假设a是一个矩阵,a的截取就可写成:a[起始行:终止行,起始列:终止列],中括号中有一个逗号,逗号前的是为了分割行的,逗号后的是为了分割列 ...

  8. ideal的maven工程启动时老是报错,提示web.xml里面的监听器找不到,但是实际又是存在的

    -X clean compile package -Dmaven.repo.local=D:\repository-pss -Dmaven.test.skip=true maven仓库地址

  9. SG函数和SG定理

    Fibonacci again and again 利用SG函数求出每一堆的SG值,如果三个值的异或和为零 先手必败态,否则,先手必胜态. #include <bits/stdc++.h> ...

  10. php 服务端允许跨域访问

    加上需要允许跨域访问,配置如下(一下配置内容前不允许有其他任何输出操作): //设置允许跨域的 请求源地址//方式一:header("Access-Control-Allow-Origin: ...