SQL优化之谓词下推

1、什么是谓词下推

        所谓谓词下推,就是将尽可能多的判断更贴近数据源,以使查询时能跳过无关的数据在文件格式使用Parquet或Orcfile时,甚至可能整块跳过不相关的文件。

2、HIVE中的谓词下推

        Hive中的Predicate Pushdown,简称谓词下推,主要思想是把过滤条件下推到map端,提前执行过滤,以减少map端到reduce端传输的数据量,提升整体性能。简言之,就 是先过滤 再做聚合等操作。

-- 具体配置项是:(默认为true)
set hive.optimize.ppd = true

总结: 

1、谓词下推:在存储层即过滤了大量大表无效数据,减少扫描无效数据;所谓下推,即谓词过滤在map端执行,所谓不下推,即谓词过滤在reduce端执行
2、inner join时,谓词放任意位置都会下推
3、left join时,左表的谓词应该写在where 后
4、right join时,左表的谓词应该写在join后

3、谓词下推导致结果不一致

        我们下面来看几个典型的SQL。

SQL1:20672 和 9721

select
    count(distinct t1.role_id) as new_role_cnt,
    count(distinct t2.role_id) as pay_role_cnt
from(
    select
        role_id, part_date
    from ods_game_dev.ods_role_create
    where part_date = '2020-01-01'
) t1
left join ods_game.dev.ods_role_recharge t2
on t1.role_id = t2.rile_id and t2.part_date = '2020-01-01'

SQL2: 9721 和 9721

select
    count(distinct t1.role_id) as new_role_cnt,
    count(distinct t2.role_id) as pay_role_cnt
from ods_game.dev.ods_role_create t1
left join ods_game.dev.ods_role_recharge t2
on t1.role_id = t2.rile_id 
where t1.part_date = '2020-01-01' and t2.part_date = '2020-01-01'

SQL3:20672 和 9721

select
    count(distinct t1.role_id) as new_role_cnt,
    count(distinct t2.role_id) as pay_role_cnt
from ods_game.dev.ods_role_create t1
left join ods_game.dev.ods_role_recharge t2
on t1.role_id = t2.rile_id and t2.part_date = '2020-01-01'
where t1.part_date = '2020-01-01'

SQL4: 184125 和 9721

select
    count(distinct t1.role_id) as new_role_cnt,
    count(distinct t2.role_id) as pay_role_cnt
from ods_game.dev.ods_role_create t1
left join ods_game.dev.ods_role_recharge t2
on t1.role_id = t2.rile_id and t2.part_date = '2020-01-01' and t1.part_date = '2020-01-01'

 从上面SQL中我们可以看出:

        1)SQL1:t1 表查询先过滤,t2 表条件写在 on 中满足谓词下推。各自进行了条件过滤后,再进行 join 。所以 count 的时候,我们看到的是 count 各自过滤条件的数据

        2)SQL2:t1 在 where 里,满足谓词下推。t2 不满足谓词下推。所以 t2 表的条件是在 join 之后过滤,这就导致在 count 的时候,都经历了 t2 表的条件。所以数据一致。

        3)SQL3:左表 t1 在 where 满足谓词下推,右表 t2 在 on 满足谓词下推。所以都是先进行了数据的过滤,再进行 join 操作。和 SQL1 一样, count 各自过滤条件的数据

        4)SQL4:左表 t1 不满足谓词下推,右表 t2 满足过滤条件。针对左表 t1 的过滤条件必须放在 where 上,放在 on 上的效果是不可预期的,不生效。右表 t2 条件在 on 里满足谓词下推,生效。所以 t1 表是全量数据, t2 表是过滤后的数据。

总结:

        通过上面的分析,谓词下推是生效的,但是在我们对最后结果的输出是因为执行顺序不同导入的结果不一致。 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
谓词下推是指在Hive中,尽量将过滤条件提前执行,使得最后参与join的表的数据量更小,从而减少数据传输IO,节约资源,提升性能。无论在Hive中是否开启了CBO(Cost-Based Optimizer),无论谓词写在ON后面还是WHERE后面,内连接(Inner Join)都会进行谓词下推。 在Hive中,谓词下推也称为Predicate Pushdown。它的实现方式是在map端提前执行过滤条件,减少map端的输出数据量。这样可以减少数据的传输和IO操作,提高查询性能。默认情况下,Hive会开启谓词下推,可以通过配置hive.optimize.ppd参数为true来开启或关闭谓词下推功能。 另外,在Hive中,如果在JOIN中有不能匹配上的表,则会使用null填充该表,这个表被称为Null Supplying Table。它是一种非保留表,用于提供null值。 综上所述,Hive SQL中的谓词下推是指在不影响结果的前提下,尽量将过滤条件提前执行,减少数据传输IO,节约资源,提升性能的优化技术。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [一文详解Hive的谓词下推](https://blog.csdn.net/java_atguigu/article/details/123064220)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值