presto查询优化
资料: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查询优化相关推荐
- presto查询mysql_Presto查询优化
我的CSDN: http://blog.csdn.net/FreeFishLy/article/details/79081764 Presto是一个开源的分布式SQL查询引擎,适用于交互式分析查询,数 ...
- 2020-12-03《Presto分布式SQL查询引擎——kkb笔记复习》
Presto分布式SQL查询引擎 一.课前准备 jdk版本要求:Java 8 Update 151 or higher (8u151+), 64-bit 安装好hadoop集群 安装好hive 二.课 ...
- 【博学谷学习记录】超强总结,用心分享|大数据之Presto
Presto的优化 Presto 的优化是一个非常有水平的问题,大致总结下,分如下几个类别: 数据存储 想要使用 Presto 更高效地查询数据,需要在数据存储方面利用一些优化手段. 合理设置分区 与 ...
- 大数据技术之-presto
一.Presto简介 1.Presto概念 Presto是一个开源的分布式SQL查询引擎,适用于交互式分析查询,数据量支持GB到PB字节 Presto的设计和编写完全是为了解决像Facebook这样规 ...
- OLAP-presto-大数据Week13-DAY-presto
文章目录 前言 一.准备 二.主题 三.目标 四.知识要点 1. Presto是什么? 2. Presto架构 3. Presto特点 1. 优点 2. 缺点 3. presto与impala对比 4 ...
- spark sql合并小文件_如何比较Hive,Spark,Impala和Presto?
Spark,Hive,Impala和Presto是基于SQL的引擎,Impala由Cloudera开发和交付.在选择这些数据库来管理数据库时,许多Hadoop用户会感到困惑.Presto是一个开放源代 ...
- 递归下降语法分析器的构建_一文了解函数式查询优化器Spark SQL Catalyst
大数据技术与架构点击右侧关注,大数据开发领域最强公众号! 暴走大数据点击右侧关注,暴走大数据!记录一下个人对sparkSql的catalyst这个函数式的可扩展的查询优化器的理解,目录如下: 0. O ...
- 全方位测评Hive、SparkSQL、Presto 等七个大数据查询引擎,最快的竟是……| 程序员硬核测评...
现在大数据组件非常多,众说不一,那么每个企业在不同的使用场景里究竟应该使用哪个引擎呢?易观Spark实战营团队选取了Hive.SparkSQL.Presto.Impala.HAWQ.ClickHous ...
- 使用Presto SQL一些常见问题总结
查询速度慢, 如何优化? 解决方法1: 避免单节点处理 虽然Presto是分布式查询引擎, 但是一些操作是必须在单节点中处理的. 例如: count(distinct x) 考虑使用approx_di ...
最新文章
- 实战:手把手教你实现用语音智能控制电脑 | 附完整代码
- SCOM 2012知识分享-26:分布式部署要点总结
- Generic Host Process for Win32 Service错误
- Maven 依赖-镜像仓库替换为 -- 阿里云镜像仓库(飞快实现 pom 引入)
- 点评老师freeeim
- 梯度下降优化算法综述(转载)
- C#也能PS图片,还能为网站Ajax上传图片同时生成微缩图(附Demo)
- Access denied for user ‘root‘@‘localhost‘ (using password: YES)
- 正确使用计算机说课稿,计算机优秀说课稿讲课讲稿.pdf
- C语言文本文档汉字乱码处理问题
- 微信账户冻结怎么解除
- PiaolinPlatformV2.0.0 - 获取手机或电脑GPS位置信息(定位平台)
- cesium 根据SampledPositionProperty与timeline实现轨迹回放功能(跟随视角、上帝视角) 详细代码与理解记录
- Win10 内置Intel AC-3165无法开启热点 解决
- android 蓝牙hf编程,基于Android蓝牙Inband ring功能实现.doc
- 小米装linux系统教程视频,小米5 miui8折腾Linux Deploy经验
- windows c++编程入门
- 运营App渠道推广中,如何统计推广效果?
- 良心整理!500G Java学习资料免费分享!
- 创建bbs mysql语句怎么写_MySQL常用语句 | 小灰灰博客