大数据查询优化之谓词下推 ?

谓词

谓词,可以理解为条件表达式,在SQL中,谓词就是返回Boolean值,即True或False的函数,或是隐式转换为Boolean的函数。SQL中的谓词主要有 LKIE、BETWEEN、IS NULL、IS NOT NULL、IN、EXISTS其结果为布尔值,即True或False。在SELECT语句的WHERE子句或HAVING子句中,确定哪些行与特定查询相关的条件或者函数。

下推

下推,即将谓词调整到数据源头或者靠近数据源头。
所谓下推,即谓词过滤在MAP端执行;所谓不下推,即谓词过滤在REDUCE端执行。

谓词下推

谓词下推(Predicate push down)又叫过滤条件下推(Filter push down)还叫 索引下推,就是让尽可能多的判断条件更贴近数据的源头,以使查询时能够跳过无关数据,从而提升查询性能。用在SQL优化上来说,就是先过滤再做聚合等操作。
谓词下推,也就是将过滤表达式下推到存储层直接过滤数据,减少传输到计算层的数据量。

谓词下推的步骤

(1). 解析查询语句,提取谓词。
(2). 评估谓词,确定其返回值的范围。
(3). 将谓词的结果推送到数据源头,以便在执行查询时减少数据传输和计算的开销。

场景说明

以下通过谓词下推,将SQL精选优化,会大大的提升了查询的性能。

优化前:
SELECT COUNT(*) FROM A JOIN B ON A.ID = B.ID WHERE A.A > 10 AND B.B < 100;
优化后:
SELECT COUNT(*) FROM (SELECT *  FROM A  WHERE A > 10) A1 
JOIN ( SELECT *  FROM B  WHERE B < 100 ) B1 ON A1.ID = B1.ID;

HIVE中的谓词下推

PPD规则:
(1). JOIN条件中的过滤,不能下推到保留行表中。
(2). WHERE条件过滤,不能下推到NULL补充表中。
具体描述来说:
(1). 对于Join(Inner Join)、Full outer Join,条件写在ON后面,还是WHERE后面,性能上面没有区别。
(2). 对于Left outer Join ,右侧的表的条件写在ON后面、左侧的表的条件写在WHERE后面,性能上有提高。
(3). 对于Right outer Join,左侧的表的条件写在ON后面、右侧的表的条件写在WHERE后面,性能上有提高。
(4). 当条件分散在两个表时,谓词下推可按上述结论2和3自由组合。
(5). 如果在条件表达式中含有不确定函数,整个表达式的谓词将不会被下推,如:UNIX_TIMESTAMP() 和 RAND()。

SELECT A.* FROM A JOIN B ON A.ID = B.ID WHERE A.DS = '2022-08-15' AND A.CREATE_TIME = UNIX_TIMESTAMP();

在这里插入图片描述

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cloneme01

谢谢您的支持与鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值