什么是谓词下推?
Predicate pushdown 将外层查询块的WHERE子句中的谓词移入较低层查询块,从而能够提早进行数据过滤,即在不影响结果的情况下,尽量将过滤条件提前执行。
为什么要进行谓词下推?
谓词下推可以使得程序提前过滤部分数据,降低Join等一系列操作的数据量级,尽可能避免程序性能问题。
谓词下推优化方式
- 词法分析类似文本分词
- 词法分析及语义分析会检查Database及table是否存在,group结合聚合函数等一些基础语法是否正确
- 逻辑计划阶段会有很多优化,对谓词的处理在这个阶段完成
- 对于Spark-Sql,物理计划是RDD的DAG图的生成过程;对于Hive-sql,物理计划是Hive Stage的生成过程。
谓词下推的第一层含义:
- 由Sql层的Filter操作符来完成过滤,然后进行全表Scan
- 由Scan全表,然后再进行过滤
谓词下推的第二层含义:谓词下推在join中的应用
内连接
- where条件中,不含or操作符,MR&spark都会进行谓词下推
- on条件中,MR&spark都会进行谓词下推
- where中,含or操作符,过滤条件与join主键一致,spark会进行谓词下推,MR不会进行谓词下推
- where中,含or操作符,过滤条件与join主键一致,spark&MR均不会谓词下推
LEFT JOIN&RIGHT JOIN
- left join过滤条件在on中,MR&Spark过滤字段取左表不下推,右表下推
- left join过滤条件在where中,且为and关系,过滤字段为关联主键MR&Spark均会进行谓词下推
- left join过滤条件在where中,且为and关系,过滤字段非关联主键取自左表都下推;引擎为MR,右表不下退;引擎为Spark右表,下推;
- left join过滤条件在where中,且为or关系,MR&Spark均不会进行谓词下推
- right join反之