incubator-doris 【Feature Wanted】left join的时候,where条件中右表的条件可以下推到Scan阶段

ujv3wf0j  于 2022-04-22  发布在  Java
关注(0)|答案(2)|浏览(117)

一个SQL是这样的:
select * from dwd_applications t1 left join dwd_assignments t2 on t1.id = t2.id
where t2.column = XXX

但是,如果t2.column需要的值,【不包含null】,其实可以这样:
select * from dwd_applications t1 left join dwd_assignments t2 on t1.id = t2.id
and t2.column = XXX
where t2.column = XXX

即,将右表的条件,【粘贴】一份到on语句中

因为左连接的时候,在 on 阶段,join不上的会被补齐null,但是where里面不要null,所以不影响执行结果

目前在0.12.21,这样的语法,通过explain来看,是没有下推到Scan阶段的

u5rb5r59

u5rb5r591#

hello,很感谢你提的问题。这个场景下不仅仅是 predicate 下推的问题了,其实可以将这个查询改写为inner join了,改写为inner join之后, predicate 就都可以下推了。

Hello, thank you very much for your question. In this scenario, it's not just the predicate push down problem. In fact, the query can be rewritten as inner join. After rewriting to inner join, predicates can be pushed down.

q3aa0525

q3aa05252#

一个SQL是这样的:
select * from dwd_applications t1 left join dwd_assignments t2 on t1.id = t2.id
where t2.column = XXX

但是,如果t2.column需要的值,【不包含null】,其实可以这样:
select * from dwd_applications t1 left join dwd_assignments t2 on t1.id = t2.id
and t2.column = XXX
where t2.column = XXX

即,将右表的条件,【粘贴】一份到on语句中

因为左连接的时候,在 on 阶段,join不上的会被补齐null,但是where里面不要null,所以不影响执行结果

目前在0.12.21,这样的语法,通过explain来看,是没有下推到Scan阶段的

你是对的。 如果右表的条件可以排除掉null,我们可以把left join 转为 inner join。 我已经在我们内部完成了outer join 转inner join 的优化,等稳定后,我会贡献到社区。

相关问题