本篇文章适合学习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,依次类推。
内容已更新至知识星球,感兴趣加入即可。
