pub struct EnforceDistribution {}Expand description
The EnforceDistribution rule ensures that distribution requirements are
met. In doing so, this rule will increase the parallelism in the plan by
introducing repartitioning operators to the physical plan.
For example, given an input such as:
┌─────────────────────────────────┐
│ │
│ ExecutionPlan │
│ │
└─────────────────────────────────┘
▲ ▲
│ │
┌─────┘ └─────┐
│ │
│ │
│ │
┌───────────┐ ┌───────────┐
│ │ │ │
│ batch A1 │ │ batch B1 │
│ │ │ │
├───────────┤ ├───────────┤
│ │ │ │
│ batch A2 │ │ batch B2 │
│ │ │ │
├───────────┤ ├───────────┤
│ │ │ │
│ batch A3 │ │ batch B3 │
│ │ │ │
└───────────┘ └───────────┘
Input Input
A BThis rule will attempt to add a RepartitionExec to increase parallelism
(to 3, in this case) and create the following arrangement:
┌─────────────────────────────────┐
│ │
│ ExecutionPlan │
│ │
└─────────────────────────────────┘
▲ ▲ ▲ Input now has 3
│ │ │ partitions
┌───────┘ │ └───────┐
│ │ │
│ │ │
┌───────────┐ ┌───────────┐ ┌───────────┐
│ │ │ │ │ │
│ batch A1 │ │ batch A3 │ │ batch B3 │
│ │ │ │ │ │
├───────────┤ ├───────────┤ ├───────────┤
│ │ │ │ │ │
│ batch B2 │ │ batch B1 │ │ batch A2 │
│ │ │ │ │ │
└───────────┘ └───────────┘ └───────────┘
▲ ▲ ▲
│ │ │
└─────────┐ │ ┌──────────┘
│ │ │
│ │ │
┌─────────────────────────────────┐ batches are
│ RepartitionExec(3) │ repartitioned
│ RoundRobin │
│ │
└─────────────────────────────────┘
▲ ▲
│ │
┌─────┘ └─────┐
│ │
│ │
│ │
┌───────────┐ ┌───────────┐
│ │ │ │
│ batch A1 │ │ batch B1 │
│ │ │ │
├───────────┤ ├───────────┤
│ │ │ │
│ batch A2 │ │ batch B2 │
│ │ │ │
├───────────┤ ├───────────┤
│ │ │ │
│ batch A3 │ │ batch B3 │
│ │ │ │
└───────────┘ └───────────┘
Input Input
A BThe EnforceDistribution rule
- is idempotent; i.e. it can be applied multiple times, each time producing the same result.
- always produces a valid plan in terms of distribution requirements. Its input plan can be valid or invalid with respect to distribution requirements, but the output plan will always be valid.
- produces a valid plan in terms of ordering requirements, if its input is
a valid plan in terms of ordering requirements. If the input plan is invalid,
this rule does not attempt to fix it as doing so is the responsibility of the
EnforceSortingrule.
Note that distribution requirements are met in the strictest way. This may
result in more than strictly necessary RepartitionExecs in the plan, but
meeting the requirements in the strictest way may help avoid possible data
skew in joins.
For example for a hash join with keys (a, b, c), the required Distribution(a, b, c) can be satisfied by several alternative partitioning ways: (a, b, c), (a, b), (a, c), (b, c), (a), (b), (c) and ( ).
This rule only chooses the exact match and satisfies the Distribution(a, b, c) by a HashPartition(a, b, c).
Implementations§
Trait Implementations§
Source§impl Debug for EnforceDistribution
impl Debug for EnforceDistribution
Source§impl Default for EnforceDistribution
impl Default for EnforceDistribution
Source§fn default() -> EnforceDistribution
fn default() -> EnforceDistribution
Source§impl PhysicalOptimizerRule for EnforceDistribution
impl PhysicalOptimizerRule for EnforceDistribution
Source§fn optimize(
&self,
plan: Arc<dyn ExecutionPlan>,
config: &ConfigOptions,
) -> Result<Arc<dyn ExecutionPlan>>
fn optimize( &self, plan: Arc<dyn ExecutionPlan>, config: &ConfigOptions, ) -> Result<Arc<dyn ExecutionPlan>>
plan to an optimized formSource§fn schema_check(&self) -> bool
fn schema_check(&self) -> bool
Auto Trait Implementations§
impl Freeze for EnforceDistribution
impl RefUnwindSafe for EnforceDistribution
impl Send for EnforceDistribution
impl Sync for EnforceDistribution
impl Unpin for EnforceDistribution
impl UnwindSafe for EnforceDistribution
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
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§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