Skip to main content

dbx_core/sql/optimizer/
mod.rs

1//! SQL 쿼리 옵티마이저 — 규칙 기반 최적화
2//!
3//! LogicalPlan을 최적화하여 실행 성능을 향상시킵니다.
4//! 4가지 핵심 규칙: PredicatePushdown, ProjectionPushdown, ConstantFolding, LimitPushdown
5
6mod constant_folding;
7mod limit_pushdown;
8mod predicate_pushdown;
9mod projection_pushdown;
10
11#[cfg(test)]
12mod tests;
13
14use crate::error::DbxResult;
15use crate::sql::planner::LogicalPlan;
16
17pub use constant_folding::ConstantFoldingRule;
18pub use limit_pushdown::LimitPushdownRule;
19pub use predicate_pushdown::PredicatePushdownRule;
20pub use projection_pushdown::ProjectionPushdownRule;
21
22/// 최적화 규칙 트레이트
23pub trait OptimizationRule: Send + Sync {
24    /// 규칙 이름
25    fn name(&self) -> &str;
26
27    /// LogicalPlan에 규칙 적용
28    fn apply(&self, plan: LogicalPlan) -> DbxResult<LogicalPlan>;
29}
30
31/// 쿼리 옵티마이저
32pub struct QueryOptimizer {
33    rules: Vec<Box<dyn OptimizationRule>>,
34}
35
36impl QueryOptimizer {
37    /// 기본 최적화 규칙으로 생성
38    pub fn new() -> Self {
39        Self {
40            rules: vec![
41                Box::new(PredicatePushdownRule),
42                Box::new(ProjectionPushdownRule),
43                Box::new(ConstantFoldingRule),
44                Box::new(LimitPushdownRule),
45            ],
46        }
47    }
48
49    /// 모든 규칙 적용
50    pub fn optimize(&self, plan: LogicalPlan) -> DbxResult<LogicalPlan> {
51        let mut optimized = plan;
52        for rule in &self.rules {
53            optimized = rule.apply(optimized)?;
54        }
55        Ok(optimized)
56    }
57}
58
59impl Default for QueryOptimizer {
60    fn default() -> Self {
61        Self::new()
62    }
63}