用户:
1、大表查询将数据拆分(表数据非实时)
(1)如公司内部有人直接上亿甚至几十亿条数据的表(或者几百TB级别的表)直接进行报表制作,这种情况,建议搞个定时任务,每天把要统计的数据放到小表里去,报表制作只查小表。
(2)报表数据来自某个json的大字段,用户直接用json解析函数获取,这种情况也建议将字段拆分平铺成一张表再进行查询。
2、Hive表小文件比较多,导致查询慢。把hive表文件合并性能会大大提高。
适当增大这两个参数也可提高查询效率
#控制每个worker上面最大可以提交多少个split,默认是100
node-scheduler.max-splits-per-node
#控制每个worker上面最多可以有多少个split处于Pending状态
node-scheduler.max-pending-splits-per-task
3、优化sql。
(1)不使用select *查询所有数据,按需查询
(2)
参数 | 值 | 默认 | 使用 | 说明 |
join-distribution-type | AUTOMATIC , PARTITIONED ,BROADCAST | AUTOMATIC | 查询时设置 -- set session join-distribution-type='BROADCAST'; select ...... | BROADCAST右表广播,AUTOMATIC会自动识别判断到底用PARTITIONED还是BROADCAST,如没有表统计信息之类的情况默认会使用PARTITIONED,这是可以手动指定下 |
redistribute-writes | true,false | true | 查询时设置 -- set session redistribute-writes='false'
| 查询没有数据倾斜的时候设置为false查询效率更高 |
系统:
1、提供缓存设置,诸如T+1的数据,用户可以设置天级别的缓存,用户当天第一次查询的时候将数据放入缓存,此后查询结果从缓存中获取。
2、如果数据源为hive,可对Hive metastore配置缓存,可根据实际情况设置缓存时长。
#文件/presto/etc/catalog/hive.properties
hive.metastore-cache-ttl
控制cache的存活时间,默认设为0,表示不启用这种cache机制hive.metastore-refresh-interval
控制cache自动刷新的频率,默认为1ms.
3、设置查询超时,原因:一些查询超过一定时间(如半分钟),那查询是无意义的,因为根本就查不出来,最后还会oom。
(1)通过jdbc连接presto的情况,设置查询超时,如超过半分钟还未查到就返回。
(2)jdbc超时后返回,只能解决客户端不再长久等待的情况,实际presto端该query并未终止,故可以设置诸如query.max-run-time之类的参数来解决。
#文件/presto/etc/config.properties
query.max-execution-time
Type: duration
Default value: 100 days
Session property: query_max_execution_time
在终止查询之前,在集群上主动执行查询的最大允许的时间。与query.max-run-time相比,执行时间不包括队列中的分析、查询规划或等待时间。
query.max-run-timeType: duration
Default value: 100 days
Session property: query_max_run_time
在终止查询之前,允许在群集上处理查询的最大时间。时间包括分析和计划的时间,也包括在队列中等待的时间,因此本质上这是自创建以来允许查询存在的时间。