DuckDB优化器之常量折叠与比较简化
本篇文章适合学习C++的小伙伴,适合阅读开源项目的小伙伴,更适合学习数据库的小伙伴,欢迎与我一起探索优化器知识。
目录
- DuckDB优化器之常量折叠与比较简化 
- 1.优化器规则 
- 2.表达式重写 - 2.1 重写/访问算子 
- 2.2 应用规则 
- 2.3 子表达式 
 
- 3.比较简化规则 
本节以一个SQL为例,揭秘DuckDB的优化器常量折叠与比较简化规则。
- ConstantFoldingRule - 常量折叠 
 
- ComparisonSimplificationRule - 比较简化 
 
示例如下
常量折叠:
D explain select temp_lo from weather where temp_lo = 45 + 1;┌─────────────────────────────┐
│┌───────────────────────────┐│
││       Physical Plan       ││
│└───────────────────────────┘│
└─────────────────────────────┘
┌───────────────────────────┐
│         SEQ_SCAN          │
│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │
│          weather          │
│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │
│          temp_lo          │
│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │
│  Filters: temp_lo=46 AND  │
│     temp_lo IS NOT NULL   │
│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │
│           EC: 0           │
└───────────────────────────┘  // 重写前
temp_lo = (45 + 1)// 重写后
(lldb) p expr->ToString() 
temp_lo = 46比较简化:
D explain select * from test where CAST(i as TIMESTAMP) = '1999-01-01'::TIMESTAMP;┌─────────────────────────────┐
│┌───────────────────────────┐│
││       Physical Plan       ││
│└───────────────────────────┘│
└─────────────────────────────┘
┌───────────────────────────┐
│         SEQ_SCAN          │
│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │
│            test           │
│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │
│             i             │
│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │
│Filters: i=1999-01-01 00:00│
│   :00 AND i IS NOT NULL   │
│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │
│           EC: 0           │
└───────────────────────────┘ // 重写前
CAST(i as TIMESTAMP) = '1999-01-01'::TIMESTAMP// 重写后
i = '1999-01-01 00:00:00'这两条SQL语句的逻辑算子为:
LOGICAL_EXPLAIN->LOGICAL_PROJECT->LOGICAL_FILTER->LOGICAL_GET
顶层是explain,然后->表示其child,依次类推。
内容已更新至知识星球,感兴趣加入即可。
