当前位置: 首页 > 工具软件 > DuckDB > 使用案例 >

2023-03-29 duckdb-查询计划-逻辑计划和物理计划

尉迟冯浩
2023-12-01

 

摘要:

duckdb的查询计划倒是很复合教科书的定义, 先将ANSI SQL转换成查询树, 生成逻辑查询计划. 然后将逻辑查询计划的节点转换成物理计划的节点.

相比于mysql的没有清晰划分的逻辑计划和物理计划, 所有操作都是对着转换后的查询树节点处理,看起来清晰了很多.

本文对逻辑计划和物理计划做一些分析. 会涉及到基于规则的优化,但是不涉及基于代价的优化.基于代价的优化随后单独分析.

 

参考

https://www.youtube.com/watch?v=bXfvmeWsQ78

 

ANSI SQL生成逻辑计划

 

  • duckdb采用了精简的postgres的语法树构建模块
  • 可以理解为将ANSI SQL先进行词法分析,也就是进行分词. 然后进行语法 分析, 也就是构建查询树节点.
  • 其实任何一个关系型数据库的这块处理都差不多, 包括mysql, 关键在于要理解经过语法分析后的查询树节点的数据结构, 这些数据结构是后续生成逻辑计划的输入

 

核心处理:

 

Planner::CreatePlan

 

#0  duckdb::Planner::CreatePlan (this=0x7ffc42d9b060, statement=...) at /root/work/duckdb-dev/trunk/duckdb-0.7.1/src/planner/planner.cpp:29
#1  0x00000000045251dc in duckdb::Planner::CreatePlan (this
 类似资料: