大数据查询优化之谓词下推 ?
谓词
谓词,可以理解为条件表达式,在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();