From 38f2d0d5a281ad58fcf8942190b9d1306dfaa8e1 Mon Sep 17 00:00:00 2001 From: "xudong.w" Date: Sat, 19 Apr 2025 10:28:00 +0800 Subject: [PATCH] Speed up optimize_projection by improving is_projection_unnecessary (#15761) --- datafusion/optimizer/src/optimize_projections/mod.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/datafusion/optimizer/src/optimize_projections/mod.rs b/datafusion/optimizer/src/optimize_projections/mod.rs index b3a09e2dcbcc7..7b99bdf6a9100 100644 --- a/datafusion/optimizer/src/optimize_projections/mod.rs +++ b/datafusion/optimizer/src/optimize_projections/mod.rs @@ -775,8 +775,12 @@ fn rewrite_projection_given_requirements( /// - input schema of the projection, output schema of the projection are same, and /// - all projection expressions are either Column or Literal fn is_projection_unnecessary(input: &LogicalPlan, proj_exprs: &[Expr]) -> Result { + // First check if all expressions are trivial (cheaper operation than `projection_schema`) + if !proj_exprs.iter().all(is_expr_trivial) { + return Ok(false); + } let proj_schema = projection_schema(input, proj_exprs)?; - Ok(&proj_schema == input.schema() && proj_exprs.iter().all(is_expr_trivial)) + Ok(&proj_schema == input.schema()) } #[cfg(test)]