sql中join的on和where操作引发的谓词下推优化

谓词下推操作,其实Hive也陆陆续续做了一定的优化操作,但是有些地方还需要我们自己人为的去进行优化,

1.在join操作中,针对一般的单表过滤条件,操作的时候尽量直接进行谓词下推操作(即把过滤条件直接放到子查询当中),不要把过滤条件在放到on后面的where条件中,防止查询的数据不准确性。

2.在join操作中,涉及到在on后面进行where判断(主要涉及到双表或者多表条件判断,比如:on a.id=b.id where a.dt=>b.start_dt and a.dt<=b.end_dt),或者case when判断多表条件操作,或者select *from a where id in(select id from b)tmp等操作时。

针对上述的几种情况来说,其实就是发生了双表(或者多表的操作判断),如果采用上述操作计算的话,则都会产生大量的map或者reduce操作,极大的影响执行效率,

因为这种不等值连接,或者in(子查询)等,都会进行双表(或者多表)全扫描操作,不会进行谓词下推操作。

针对上述情况,暂时的处理的方法,使用的是shell脚本传参变量,然后进行操作。当然如果数据量不大的情况下,减少脚本的复杂性等,直接使用上正常述操作就行

start_dt=(`mysql -A dbname -hdb_host -udb_user -pdb_pwd -ss -e 'SELECT start_dt FROM b"'`) 
select * from a where dt>='${start_dt}' ;

  参考:shell脚本引用MySQL

谓词下推参考:

参考:

从一个sql引发的hive谓词下推的全面复盘及源码分析(on where执行顺序问题及源码分析

原文地址:https://www.cnblogs.com/-courage/p/14189994.html