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§
source§impl EliminateOuterJoin
impl EliminateOuterJoin
pub fn new() -> EliminateOuterJoin
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>, DataFusionError>
fn try_optimize( &self, plan: &LogicalPlan, _config: &dyn OptimizerConfig ) -> Result<Option<LogicalPlan>, DataFusionError>
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 moreAuto Trait Implementations§
impl Freeze for EliminateOuterJoin
impl RefUnwindSafe for EliminateOuterJoin
impl Send for EliminateOuterJoin
impl Sync for EliminateOuterJoin
impl Unpin for EliminateOuterJoin
impl UnwindSafe for EliminateOuterJoin
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<T> Instrument for T
impl<T> Instrument for T
source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<T> IntoEither for T
impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more