谓词下推:在SQL执行优化策略时,会将where相关的过滤条件放在前面来执行,如果此时涉及和另一张表的join操作,那么就可能会踩坑
场景:1、A joinB 2、将join后的A的数据执行UDF 3、UDF处理后的数据过滤
谓词下推后的执行顺序: 1、A中某字段执行UDF 2、对UDF处理后的数据进行过滤 3、过滤后的A与B再进行join
问题点:谓词下推的原则是:先过滤再join,但是UDF逻辑较重,效率上:(join后少量数据执行UDF的时间)<(先全量执行UDF再过滤的时间),所以自动进行谓词下推的优化,再自定义UDF时就会存在这样的坑,使得全量数据先执行了UDF,导致效率降低
解决办法:将join后的where过滤条件全砍掉,保证先join再UDF,过滤逻辑放在下游
效果:可以整体提高SQL的执行效率(我的使用场景是实时flink SQL,如果不进行优化,全量先执行UDF资源将多耗费5倍以上,当然视具体join过滤后的数据量占比而定)