OptimizeProjections

Struct OptimizeProjections 

Source
pub struct OptimizeProjections {}
Expand description

Optimizer rule to prune unnecessary columns from intermediate schemas inside the LogicalPlan. This rule:

  • Removes unnecessary columns that do not appear at the output and/or are not used during any computation step.
  • Adds projections to decrease table column size before operators that benefit from a smaller memory footprint at its input.
  • Removes unnecessary LogicalPlan::Projections from the LogicalPlan.

OptimizeProjections is an optimizer rule that identifies and eliminates columns from a logical plan that are not used by downstream operations. This can improve query performance and reduce unnecessary data processing.

The rule analyzes the input logical plan, determines the necessary column indices, and then removes any unnecessary columns. It also removes any unnecessary projections from the plan tree.

§Schema, Field Properties, and Metadata Handling

The OptimizeProjections rule preserves schema and field metadata in most optimization scenarios:

Schema-level metadata preservation by plan type:

  • Window and Aggregate plans: Schema metadata is preserved
  • Projection plans: Schema metadata is preserved per projection_schema.
  • Other logical plans: Schema metadata is preserved unless LogicalPlan::recompute_schema is called on plan types that drop metadata

Field-level properties and metadata: Individual field properties are preserved when fields are retained in the optimized plan, determined by exprlist_to_fields and ExprSchemable::to_field.

Field precedence: When the same field appears multiple times, the optimizer maintains one occurrence and removes duplicates (refer to RequiredIndices::compact()), preserving the properties and metadata of that occurrence.

Implementations§

Trait Implementations§

Source§

impl Debug for OptimizeProjections

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for OptimizeProjections

Source§

fn default() -> OptimizeProjections

Returns the “default value” for a type. Read more
Source§

impl OptimizerRule for OptimizeProjections

Source§

fn name(&self) -> &str

A human readable name for this optimizer rule
Source§

fn apply_order(&self) -> Option<ApplyOrder>

How should the rule be applied by the optimizer? See comments on ApplyOrder for details. Read more
Source§

fn supports_rewrite(&self) -> bool

👎Deprecated since 47.0.0: This method is no longer used
Does this rule support rewriting owned plans (rather than by reference)?
Source§

fn rewrite( &self, plan: LogicalPlan, config: &dyn OptimizerConfig, ) -> Result<Transformed<LogicalPlan>>

Try to rewrite plan to an optimized form, returning Transformed::yes if the plan was rewritten and Transformed::no if it was not.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> Allocation for T
where T: RefUnwindSafe + Send + Sync,