pub struct EliminateOuterJoin;
Expand description
Attempt to replace outer joins with inner joins.
Outer joins are typically more expensive to compute at runtime than inner joins and prevent various forms of predicate pushdown and other optimizations, so removing them if possible is beneficial.
Inner joins filter out rows that do match. Outer joins pass rows that do not match padded with nulls. If there is a filter in the query that would filter any such null rows after the join the rows introduced by the outer join are filtered.
For example, in the select ... from a left join b on ... where b.xx = 100;
For rows when b.xx
is null (as it would be after an outer join),
the b.xx = 100
predicate filters them out and there is no
need to produce null rows for output.
Generally, an outer join can be rewritten to inner join if the filters from the WHERE clause return false while any inputs are null and columns of those quals are come from nullable side of outer join.
Implementations§
Trait Implementations§
source§impl Default for EliminateOuterJoin
impl Default for EliminateOuterJoin
source§fn default() -> EliminateOuterJoin
fn default() -> EliminateOuterJoin
source§impl OptimizerRule for EliminateOuterJoin
impl OptimizerRule for EliminateOuterJoin
Attempt to eliminate outer joins.
source§fn try_optimize(
&self,
plan: &LogicalPlan,
_config: &dyn OptimizerConfig
) -> Result<Option<LogicalPlan>>
fn try_optimize( &self, plan: &LogicalPlan, _config: &dyn OptimizerConfig ) -> Result<Option<LogicalPlan>>
plan
to an optimized form, returning None if the plan cannot be
optimized by this rule.source§fn apply_order(&self) -> Option<ApplyOrder>
fn apply_order(&self) -> Option<ApplyOrder>
ApplyOrder
for details. Read more