AQEOptimizer — AQE Logical Optimizer¶
AQEOptimizer is the logical optimizer for optimizing logical plans in Adaptive Query Execution.

AQEOptimizer is used in AdaptiveSparkPlanExec physical operator.
AQEOptimizer uses spark.sql.adaptive.optimizer.excludedRules configuration property to exclude logical optimizations from the batches of logical optimization rules.
AQEOptimizer is a Catalyst RuleExecutor of the logical (optimization) rules (RuleExecutor[LogicalPlan]).
Creating Instance¶
AQEOptimizer takes the following to be created:
AQEOptimizer is created alongside AdaptiveSparkPlanExec physical operator.
Default Batches¶
defaultBatches: Seq[Batch]
AQEOptimizer creates a collection of batches with logical optimizations (in the order of their execution):
defaultBatches is used as the batches.
Dynamic Join Selection¶
Dynamic Join Selection is a once-executed batch of the following rules:
Eliminate Limits¶
Eliminate Limits is a fixed-point batch of the following rules:
EliminateLimits
Optimize One Row Plan¶
Optimize One Row Plan is a fixed-point batch of the following rules:
OptimizeOneRowPlan
Propagate Empty Relations¶
Propagate Empty Relations is a fixed-point batch of the following rules:
Creating FixedPoint Batch Execution Strategy¶
fixedPoint: FixedPoint
fixedPoint creates a FixedPoint batch execution strategy with the following:
| Attribute | Value | 
|---|---|
| maxIterations | spark.sql.optimizer.maxIterations | 
| maxIterationsSetting | spark.sql.optimizer.maxIterations |  
Batches¶
batches: Seq[Batch]
batches is part of the RuleExecutor abstraction.
batches returns the default rules excluding the ones specified in the spark.sql.adaptive.optimizer.excludedRules configuration property.
For excluded rules, batches prints out the following INFO message to the logs:
Optimization rule '[ruleName]' is excluded from the optimizer.
For batches with all rules excluded, batches prints out the following INFO message to the logs:
Optimization batch '[name]' is excluded from the optimizer as all enclosed rules have been excluded.
Logging¶
Enable ALL logging level for org.apache.spark.sql.execution.adaptive.AQEOptimizer logger to see what happens inside.
Add the following line to conf/log4j2.properties:
logger.AQEOptimizer.name = org.apache.spark.sql.execution.adaptive.AQEOptimizer
logger.AQEOptimizer.level = all
Refer to Logging.