Skip to content

Commit 802b033

Browse files
authored
feat(optimizer): add optimizer skip list (#17750)
1 parent c057fe9 commit 802b033

File tree

18 files changed

+89
-49
lines changed

18 files changed

+89
-49
lines changed

src/query/settings/src/settings_default.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1249,6 +1249,14 @@ impl DefaultSettings {
12491249
scope: SettingScope::Both,
12501250
range: Some(SettingRange::Numeric(0..=1)),
12511251
}),
1252+
// Add this to the HashMap in DefaultSettings::instance()
1253+
("optimizer_skip_list", DefaultSettingValue {
1254+
value: UserSettingValue::String(String::new()),
1255+
desc: "Comma-separated(,) list of optimizer names to skip during query optimization",
1256+
mode: SettingMode::Both,
1257+
scope: SettingScope::Both,
1258+
range: None,
1259+
}),
12521260

12531261
]);
12541262

src/query/settings/src/settings_getter_setter.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -928,4 +928,8 @@ impl Settings {
928928
pub fn get_enable_optimizer_trace(&self) -> Result<bool> {
929929
Ok(self.try_get_u64("enable_optimizer_trace")? == 1)
930930
}
931+
932+
pub fn get_optimizer_skip_list(&self) -> Result<String> {
933+
self.try_get_string("optimizer_skip_list")
934+
}
931935
}

src/query/sql/src/planner/optimizer/optimizer.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ use crate::optimizer::optimizers::recursive::RecursiveRuleOptimizer;
3636
use crate::optimizer::optimizers::rule::RuleID;
3737
use crate::optimizer::optimizers::rule::DEFAULT_REWRITE_RULES;
3838
use crate::optimizer::optimizers::CascadesOptimizer;
39-
use crate::optimizer::optimizers::DPhpy;
39+
use crate::optimizer::optimizers::DPhpyOptimizer;
4040
use crate::optimizer::pipeline::OptimizerPipeline;
4141
use crate::optimizer::statistics::CollectStatisticsOptimizer;
4242
use crate::optimizer::OptimizerContext;
@@ -54,7 +54,7 @@ use crate::plans::SetScalarsOrQuery;
5454
use crate::InsertInputSource;
5555

5656
#[fastrace::trace]
57-
#[async_recursion(#[recursive::recursive])]
57+
#[async_recursion(# [recursive::recursive])]
5858
pub async fn optimize(opt_ctx: Arc<OptimizerContext>, plan: Plan) -> Result<Plan> {
5959
match plan {
6060
Plan::Query {
@@ -262,7 +262,7 @@ pub async fn optimize_query(opt_ctx: Arc<OptimizerContext>, s_expr: SExpr) -> Re
262262
RuleID::SplitAggregate,
263263
]))
264264
// 9. Apply DPhyp algorithm for cost-based join reordering
265-
.add(DPhpy::new(opt_ctx.clone()))
265+
.add(DPhpyOptimizer::new(opt_ctx.clone()))
266266
// 10. After join reorder, Convert some single join to inner join.
267267
.add(SingleToInnerOptimizer::new())
268268
// 11. Deduplicate join conditions.
@@ -306,7 +306,7 @@ async fn get_optimized_memo(opt_ctx: Arc<OptimizerContext>, s_expr: SExpr) -> Re
306306
RuleID::SplitAggregate,
307307
]))
308308
// Cost based optimization
309-
.add(DPhpy::new(opt_ctx.clone()))
309+
.add(DPhpyOptimizer::new(opt_ctx.clone()))
310310
.add(CascadesOptimizer::new(opt_ctx.clone())?);
311311

312312
let _s_expr = pipeline.execute().await?;

src/query/sql/src/planner/optimizer/optimizer_api.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,14 @@ use crate::optimizer::ir::Memo;
1818
use crate::optimizer::ir::SExpr;
1919

2020
/// Trait defining the interface for query optimizers.
21-
2221
#[async_trait::async_trait]
2322
pub trait Optimizer: Send + Sync {
24-
/// Optimize the given expression and return the optimized version.
25-
async fn optimize(&mut self, expr: &SExpr) -> Result<SExpr>;
26-
2723
/// Returns a unique identifier for this optimizer.
2824
fn name(&self) -> String;
2925

26+
/// Optimize the given expression and return the optimized version.
27+
async fn optimize(&mut self, expr: &SExpr) -> Result<SExpr>;
28+
3029
/// Get the memo if this optimizer maintains one.
3130
/// Default implementation returns None for optimizers that don't use a memo.
3231
fn memo(&self) -> Option<&Memo> {

src/query/sql/src/planner/optimizer/optimizers/cascades/cascade.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ use crate::optimizer::ir::SExpr;
2727
use crate::optimizer::optimizers::cascades::cost::DefaultCostModel;
2828
use crate::optimizer::optimizers::cascades::rule::StrategyFactory;
2929
use crate::optimizer::optimizers::cascades::tasks::OptimizeGroupTask;
30-
use crate::optimizer::optimizers::cascades::tasks::Scheduler;
3130
use crate::optimizer::optimizers::cascades::tasks::Task;
31+
use crate::optimizer::optimizers::cascades::tasks::TaskManager;
3232
use crate::optimizer::optimizers::cascades::tasks::DEFAULT_TASK_LIMIT;
3333
use crate::optimizer::optimizers::distributed::DistributedOptimizer;
3434
use crate::optimizer::optimizers::distributed::SortAndLimitPushDownOptimizer;
@@ -178,7 +178,7 @@ impl CascadesOptimizer {
178178
0
179179
};
180180

181-
let mut scheduler = Scheduler::new().with_task_limit(task_limit);
181+
let mut scheduler = TaskManager::new().with_task_limit(task_limit);
182182
scheduler.add_task(Task::OptimizeGroup(root_task));
183183
scheduler.run(self)?;
184184

src/query/sql/src/planner/optimizer/optimizers/cascades/tasks/explore_expr.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ use educe::Educe;
2222
use super::apply_rule::ApplyRuleTask;
2323
use super::explore_group::ExploreGroupTask;
2424
use super::Task;
25-
use crate::optimizer::optimizers::cascades::tasks::Scheduler;
2625
use crate::optimizer::optimizers::cascades::tasks::SharedCounter;
26+
use crate::optimizer::optimizers::cascades::tasks::TaskManager;
2727
use crate::optimizer::optimizers::cascades::CascadesOptimizer;
2828
use crate::IndexType;
2929

@@ -82,7 +82,7 @@ impl ExploreExprTask {
8282
pub fn execute(
8383
mut self,
8484
optimizer: &mut CascadesOptimizer,
85-
scheduler: &mut Scheduler,
85+
scheduler: &mut TaskManager,
8686
) -> Result<Option<Task>> {
8787
if matches!(self.state, ExploreExprState::ExploredSelf) {
8888
return Ok(None);
@@ -94,7 +94,7 @@ impl ExploreExprTask {
9494
fn transition(
9595
&mut self,
9696
optimizer: &mut CascadesOptimizer,
97-
scheduler: &mut Scheduler,
97+
scheduler: &mut TaskManager,
9898
) -> Result<()> {
9999
let event = match self.state {
100100
ExploreExprState::Init => self.explore_children(optimizer, scheduler)?,
@@ -124,7 +124,7 @@ impl ExploreExprTask {
124124
fn explore_children(
125125
&mut self,
126126
optimizer: &mut CascadesOptimizer,
127-
scheduler: &mut Scheduler,
127+
scheduler: &mut TaskManager,
128128
) -> Result<ExploreExprEvent> {
129129
let m_expr = optimizer
130130
.memo
@@ -152,7 +152,7 @@ impl ExploreExprTask {
152152
fn explore_self(
153153
&mut self,
154154
optimizer: &mut CascadesOptimizer,
155-
scheduler: &mut Scheduler,
155+
scheduler: &mut TaskManager,
156156
) -> Result<ExploreExprEvent> {
157157
let m_expr = optimizer
158158
.memo

src/query/sql/src/planner/optimizer/optimizers/cascades/tasks/explore_group.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ use educe::Educe;
2222
use super::explore_expr::ExploreExprTask;
2323
use super::Task;
2424
use crate::optimizer::ir::GroupState;
25-
use crate::optimizer::optimizers::cascades::tasks::Scheduler;
2625
use crate::optimizer::optimizers::cascades::tasks::SharedCounter;
26+
use crate::optimizer::optimizers::cascades::tasks::TaskManager;
2727
use crate::optimizer::optimizers::cascades::CascadesOptimizer;
2828
use crate::IndexType;
2929

@@ -74,7 +74,7 @@ impl ExploreGroupTask {
7474
pub fn execute(
7575
mut self,
7676
optimizer: &mut CascadesOptimizer,
77-
scheduler: &mut Scheduler,
77+
scheduler: &mut TaskManager,
7878
) -> Result<Option<Task>> {
7979
if matches!(self.state, ExploreGroupState::Explored) {
8080
return Ok(None);
@@ -86,7 +86,7 @@ impl ExploreGroupTask {
8686
pub fn transition(
8787
&mut self,
8888
optimizer: &mut CascadesOptimizer,
89-
scheduler: &mut Scheduler,
89+
scheduler: &mut TaskManager,
9090
) -> Result<()> {
9191
let event = match self.state {
9292
ExploreGroupState::Init => self.explore_group(optimizer, scheduler)?,
@@ -111,7 +111,7 @@ impl ExploreGroupTask {
111111
fn explore_group(
112112
&mut self,
113113
optimizer: &mut CascadesOptimizer,
114-
scheduler: &mut Scheduler,
114+
scheduler: &mut TaskManager,
115115
) -> Result<ExploreGroupEvent> {
116116
let group = optimizer.memo.group_mut(self.group_index)?;
117117

src/query/sql/src/planner/optimizer/optimizers/cascades/tasks/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,5 +27,5 @@ pub use optimize_expr::OptimizeExprTask;
2727
pub use optimize_group::OptimizeGroupTask;
2828
pub use task::SharedCounter;
2929
pub use task::Task;
30-
pub use task_manager::Scheduler;
30+
pub use task_manager::TaskManager;
3131
pub use task_manager::DEFAULT_TASK_LIMIT;

src/query/sql/src/planner/optimizer/optimizers/cascades/tasks/optimize_expr.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ use crate::optimizer::ir::PatternExtractor;
3131
use crate::optimizer::ir::RelExpr;
3232
use crate::optimizer::ir::RequiredProperty;
3333
use crate::optimizer::ir::SExpr;
34-
use crate::optimizer::optimizers::cascades::tasks::Scheduler;
3534
use crate::optimizer::optimizers::cascades::tasks::SharedCounter;
35+
use crate::optimizer::optimizers::cascades::tasks::TaskManager;
3636
use crate::optimizer::optimizers::cascades::CascadesOptimizer;
3737
use crate::plans::RelOperator;
3838
use crate::IndexType;
@@ -117,7 +117,7 @@ impl OptimizeExprTask {
117117
pub fn execute(
118118
mut self,
119119
optimizer: &mut CascadesOptimizer,
120-
scheduler: &mut Scheduler,
120+
scheduler: &mut TaskManager,
121121
) -> Result<Option<Task>> {
122122
if matches!(self.state, OptimizeExprState::Finished) {
123123
return Ok(None);
@@ -129,7 +129,7 @@ impl OptimizeExprTask {
129129
fn transition(
130130
&mut self,
131131
optimizer: &mut CascadesOptimizer,
132-
scheduler: &mut Scheduler,
132+
scheduler: &mut TaskManager,
133133
) -> Result<()> {
134134
let event = match self.state {
135135
OptimizeExprState::Init => OptimizeExprEvent::OptimizingChildren,
@@ -181,7 +181,7 @@ impl OptimizeExprTask {
181181
fn optimize_children(
182182
&mut self,
183183
optimizer: &mut CascadesOptimizer,
184-
scheduler: &mut Scheduler,
184+
scheduler: &mut TaskManager,
185185
) -> Result<OptimizeExprEvent> {
186186
let m_expr = optimizer
187187
.memo
@@ -268,7 +268,7 @@ impl OptimizeExprTask {
268268
fn optimize_self(
269269
&mut self,
270270
optimizer: &mut CascadesOptimizer,
271-
_scheduler: &mut Scheduler,
271+
_scheduler: &mut TaskManager,
272272
) -> Result<OptimizeExprEvent> {
273273
let m_expr = optimizer
274274
.memo

src/query/sql/src/planner/optimizer/optimizers/cascades/tasks/optimize_group.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ use super::Task;
2424
use crate::optimizer::ir::RelExpr;
2525
use crate::optimizer::ir::RequiredProperty;
2626
use crate::optimizer::optimizers::cascades::tasks::ExploreGroupTask;
27-
use crate::optimizer::optimizers::cascades::tasks::Scheduler;
2827
use crate::optimizer::optimizers::cascades::tasks::SharedCounter;
28+
use crate::optimizer::optimizers::cascades::tasks::TaskManager;
2929
use crate::optimizer::optimizers::cascades::CascadesOptimizer;
3030
use crate::plans::Operator;
3131
use crate::IndexType;
@@ -90,7 +90,7 @@ impl OptimizeGroupTask {
9090
pub fn execute(
9191
mut self,
9292
optimizer: &mut CascadesOptimizer,
93-
scheduler: &mut Scheduler,
93+
scheduler: &mut TaskManager,
9494
) -> Result<Option<Task>> {
9595
if matches!(self.state, OptimizeGroupState::Optimized) {
9696
return Ok(None);
@@ -102,7 +102,7 @@ impl OptimizeGroupTask {
102102
fn transition(
103103
&mut self,
104104
optimizer: &mut CascadesOptimizer,
105-
scheduler: &mut Scheduler,
105+
scheduler: &mut TaskManager,
106106
) -> Result<()> {
107107
let event = match self.state {
108108
OptimizeGroupState::Init => self.explore_group(optimizer, scheduler)?,
@@ -133,7 +133,7 @@ impl OptimizeGroupTask {
133133
fn explore_group(
134134
&mut self,
135135
optimizer: &mut CascadesOptimizer,
136-
scheduler: &mut Scheduler,
136+
scheduler: &mut TaskManager,
137137
) -> Result<OptimizeGroupEvent> {
138138
let group = optimizer.memo.group(self.group_index)?;
139139
if !group.state.explored() {
@@ -149,7 +149,7 @@ impl OptimizeGroupTask {
149149
fn optimize_group(
150150
&mut self,
151151
optimizer: &mut CascadesOptimizer,
152-
scheduler: &mut Scheduler,
152+
scheduler: &mut TaskManager,
153153
) -> Result<OptimizeGroupEvent> {
154154
let group = optimizer.memo.group_mut(self.group_index)?;
155155

0 commit comments

Comments
 (0)