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,依次类推。
内容已更新至知识星球,感兴趣加入即可。