资料:https://www.jianshu.com/p/f435ce79c966

数据存储优化

  • 合理设置分区
    与Hive类似,Presto会根据元信息读取分区数据,合理的分区能减少Presto数据读取量,提升查询性能。

  • 使用列式存储
    Presto对ORC文件读取做了特定优化,因此在Hive中创建Presto使用的表时,建议采用ORC格式存储。相对于Parquet,Presto对ORC支持更好。

  • 使用压缩
    数据压缩可以减少节点间数据传输对IO带宽压力,对于即席查询需要快速解压,建议采用snappy压缩

  • 预先排序
    对于已经排序的数据,在查询的数据过滤阶段,ORC格式支持跳过读取不必要的数据。比如对于经常需要过滤的字段可以预先排序。

INSERT INTO table nation_orc partition(p) SELECT * FROM nation SORT BY n_name;

如果需要过滤n_name字段,则性能将提升。

SELECT count(*) FROM nation_orc WHERE n_name=’AUSTRALIA’;

查询SQL优化

  • 只选择使用必要的字段
    由于采用列式存储,选择需要的字段可加快字段的读取、减少数据量。避免采用*读取所有字段。
[GOOD]: SELECT time,user,host FROM tbl
[BAD]:  SELECT * FROM tbl
  • 过滤条件必须加上分区字段
    对于有分区的表,where语句中优先使用分区字段进行过滤。acct_day是分区字段,visit_time是具体访问时间
[GOOD]: SELECT time,user,host FROM tbl where acct_day=20171101
[BAD]:  SELECT * FROM tbl where visit_time=20171101

Group By语句优化

合理安排Group by语句中字段顺序对性能有一定提升。将Group By语句中字段按照每个字段distinct数据多少进行降序排列。示例中uid是用户id,比性别数据大很多。

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

Order by时使用Limit

Order by需要扫描数据到单个worker节点进行排序,导致单个worker需要大量内存。如果是查询Top N或者Bottom N,使用limit可减少排序计算和内存压力。

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

还有尽量将排序的字段减少些能加快计算。

使用近似聚合函数

Presto有一些近似聚合函数,对于允许有少量误差的查询场景,使用这些函数对查询性能有大幅提升。比如使用approx_distinct() 函数比Count(distinct x)有大概2.3%的误差。

SELECT approx_distinct(user_id) FROM access

如果非要精确去重,请用Count+Group 语句代替

用regexp_like代替多个like语句

Presto查询优化器没有对多个like语句进行优化,使用regexp_like对性能有较大提升

[GOOD]
SELECT...
FROMaccess
WHEREregexp_like(method, 'GET|POST|PUT|DELETE')[BAD]
SELECT...
FROMaccess
WHEREmethod LIKE '%GET%' ORmethod LIKE '%POST%' ORmethod LIKE '%PUT%' ORmethod LIKE '%DELETE%'

使用Join语句时将大表放在左边

Presto中join的默认算法是broadcast join,即将join左边的表分割到多个worker,然后将join右边的表数据整个复制一份发送到每个worker进行计算。如果右边的表数据量太大,则可能会报内存溢出错误。

[GOOD] SELECT ... FROM large_table l join small_table s on l.id = s.id
[BAD] SELECT ... FROM small_table s join large_table l on l.id = s.id

如果左表和右表都比较大怎么办?为了防止内存报错
1)修改配置distributed-joins-enabled (presto version >=0.196)
2)在每次查询开始使用distributed_join的session选项

-- set session distributed_join = 'true'
SELECT ... FROM large_table1 join large_table2
on large_table1.id = large_table2.id

核心点就是使用distributed join. Presto的这种配置类型会将左表和右表同时以join key的hash value为分区字段进行分区. 所以即使右表也是大表,也会被拆分.
缺点是会增加很多网络数据传输, 所以会比broadcast join的效率慢.

使用Rank函数代替row_number函数来获取Top N

在进行一些分组排序场景时,使用rank函数性能更好

[GOOD]
SELECT checksum(rnk)
FROM (SELECT rank() OVER (PARTITION BY l_orderkey, l_partkey ORDER BY l_shipdate DESC) AS rnkFROM lineitem
) t
WHERE rnk = 1[BAD]
SELECT checksum(rnk)
FROM (SELECT row_number() OVER (PARTITION BY l_orderkey, l_partkey ORDER BY l_shipdate DESC) AS rnkFROM lineitem
) t
WHERE rnk = 1

多用with语句

使用Presto分析统计数据时,可考虑把多次查询合并为一次查询,用Presto提供的子查询完成。
这点和我们熟知的MySQL的使用不是很一样。注意下列子查询中的逗号。

WITH subquery_1 AS (SELECT a1, a2, a3 FROM Table_1 WHERE a3 between 20180101 and 20180131
),
subquery_2 AS (SELECT b1, b2, b3FROM Table_2WHERE b3 between 20180101 and 20180131
)
SELECT subquery_1.a1, subquery_1.a2, subquery_2.b1, subquery_2.b2
FROM subquery_1JOIN subquery_2ON subquery_1.a3 = subquery_2.b3;

尽量用UNION ALL代替UNION

和distinct的原因类似, UNION有去重的功能, 所以会引发内存使用的问题.
如果你只是拼接两个或者多个SQL查询的结果, 考虑用UNION ALL

presto查询优化相关推荐

  1. presto查询mysql_Presto查询优化

    我的CSDN: http://blog.csdn.net/FreeFishLy/article/details/79081764 Presto是一个开源的分布式SQL查询引擎,适用于交互式分析查询,数 ...

  2. 2020-12-03《Presto分布式SQL查询引擎——kkb笔记复习》

    Presto分布式SQL查询引擎 一.课前准备 jdk版本要求:Java 8 Update 151 or higher (8u151+), 64-bit 安装好hadoop集群 安装好hive 二.课 ...

  3. 【博学谷学习记录】超强总结,用心分享|大数据之Presto

    Presto的优化 Presto 的优化是一个非常有水平的问题,大致总结下,分如下几个类别: 数据存储 想要使用 Presto 更高效地查询数据,需要在数据存储方面利用一些优化手段. 合理设置分区 与 ...

  4. 大数据技术之-presto

    一.Presto简介 1.Presto概念 Presto是一个开源的分布式SQL查询引擎,适用于交互式分析查询,数据量支持GB到PB字节 Presto的设计和编写完全是为了解决像Facebook这样规 ...

  5. OLAP-presto-大数据Week13-DAY-presto

    文章目录 前言 一.准备 二.主题 三.目标 四.知识要点 1. Presto是什么? 2. Presto架构 3. Presto特点 1. 优点 2. 缺点 3. presto与impala对比 4 ...

  6. spark sql合并小文件_如何比较Hive,Spark,Impala和Presto?

    Spark,Hive,Impala和Presto是基于SQL的引擎,Impala由Cloudera开发和交付.在选择这些数据库来管理数据库时,许多Hadoop用户会感到困惑.Presto是一个开放源代 ...

  7. 递归下降语法分析器的构建_一文了解函数式查询优化器Spark SQL Catalyst

    大数据技术与架构点击右侧关注,大数据开发领域最强公众号! 暴走大数据点击右侧关注,暴走大数据!记录一下个人对sparkSql的catalyst这个函数式的可扩展的查询优化器的理解,目录如下: 0. O ...

  8. 全方位测评Hive、SparkSQL、Presto 等七个大数据查询引擎,最快的竟是……| 程序员硬核测评...

    现在大数据组件非常多,众说不一,那么每个企业在不同的使用场景里究竟应该使用哪个引擎呢?易观Spark实战营团队选取了Hive.SparkSQL.Presto.Impala.HAWQ.ClickHous ...

  9. 使用Presto SQL一些常见问题总结

    查询速度慢, 如何优化? 解决方法1: 避免单节点处理 虽然Presto是分布式查询引擎, 但是一些操作是必须在单节点中处理的. 例如: count(distinct x) 考虑使用approx_di ...

最新文章

  1. 实战:手把手教你实现用语音智能控制电脑 | 附完整代码
  2. SCOM 2012知识分享-26:分布式部署要点总结
  3. Generic Host Process for Win32 Service错误
  4. Maven 依赖-镜像仓库替换为 -- 阿里云镜像仓库(飞快实现 pom 引入)
  5. 点评老师freeeim
  6. 梯度下降优化算法综述(转载)
  7. C#也能PS图片,还能为网站Ajax上传图片同时生成微缩图(附Demo)
  8. Access denied for user ‘root‘@‘localhost‘ (using password: YES)
  9. 正确使用计算机说课稿,计算机优秀说课稿讲课讲稿.pdf
  10. C语言文本文档汉字乱码处理问题
  11. 微信账户冻结怎么解除
  12. PiaolinPlatformV2.0.0 - 获取手机或电脑GPS位置信息(定位平台)
  13. cesium 根据SampledPositionProperty与timeline实现轨迹回放功能(跟随视角、上帝视角) 详细代码与理解记录
  14. Win10 内置Intel AC-3165无法开启热点 解决
  15. android 蓝牙hf编程,基于Android蓝牙Inband ring功能实现.doc
  16. 小米装linux系统教程视频,小米5 miui8折腾Linux Deploy经验
  17. windows c++编程入门
  18. 运营App渠道推广中,如何统计推广效果?
  19. 良心整理!500G Java学习资料免费分享!
  20. 创建bbs mysql语句怎么写_MySQL常用语句 | 小灰灰博客

热门文章

  1. 仿掌上英雄联盟能力值分析效果
  2. wininet内部实现探索
  3. Bloom filter(布隆过滤器)学习与使用总结
  4. ARM存储器之:协处理器CP15
  5. python 套索回归_适用于python的自适应套索
  6. C++Opencv中Mat类型创建与读取某点像素值
  7. 8.30 vim编辑器 文件查找 文件系统 作业(练习)
  8. 第4章第15节:如何利用裁剪图形制作探照灯滚动扫描效果 [SwiftUI快速入门到实战]
  9. 火狐浏览器如何修改网页为护眼色
  10. Flutter iOS 升级到ios13 之后,编译报错的问题