一些大任务SQL的优化方案

最近在优化集群的大任务,发现许多大任务的SQL都有一个特点:查询数据量大,导致扫描过滤以及shuffle的时间长。这种sql一般都是查询的时间范围比较大(我们集群的表基本都按天分区),从1个月到2年不等,然后又要每天运行,占用了集群相当大的资源。

对于这类任务,其实有很大的优化空间。举个例子:

select
  name,
  count(1) as occurCount
from
  test
where
  date_p > 20200901
  and date_p < 20200930
  and province = '福建'
group by
  name

这个sql每天都会查询近一个月的数据,10月01日查询20200901-20200930的数据,10月02日查询20200902-20201001的数据。我们会发现,10月2日计算的20200902-20200930这些数据其实在1号的时候都已经算过了,这时候又做了重复的计算。为了避免这些重复的计算,我们可以提前每天的数据写入到一张中简表,之后再从这些中简表读取数据进行合并(此时每天的数据合并过一次了,读取数据量会少很多):

在这里插入图片描述

优化步骤:

1、建立表 test_intermediate (name,occurCount)

2、创建每日任务 【清洗数据到中间表 test_intermediate】:

insert overwrite table test_intermediate partiton(date_p=${date_p})
select
  name,
  count(1) as occurCount
from
  test_intermediate
where
  date_p = ${date_p}
  and province = '福建'
group by
  name

3、优化之前的sql(从中间表读取数据):

select
  name,
  sum(occurCount) as occurCount
from
  test_intermediate
where
  date_p > 20200901
  and date_p < 20200930
group by
  name
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值