CockroachDB 逻辑执行计划简单分析

来源:互联网 发布:人工智能第三版答案 编辑:程序博客网 时间:2024/06/08 08:52

代码位置

pkg/sql/plan.go中的makePlan

层次结构解析

makePlan 主要是生成执行计划的作用。执行计划分为两个步骤:
1. newPlan 生成一个原始执行计划
2. optimizePlan 优化执行计划,生成最终执行计划

newPlan 会根据语句的类型生成对应的planNode。后续的说明会根据 selectCluase 解释说明。下图就是组成makePlan的代码部分。

optimizePlan 会在后续进行说明

makePlan中的操作

selectCluase内部的结构

对应于selectCluase,包含select语句的所有模块的处理操作(将AST树转换成为执行计划树)。举例来说明:

SELECT l.id, r.name FROM user l INNER JOIN profile r on l.id = r.user_id WHERE r.location = "beijing";

initFrom : FROM user l INNER JOIN profile r on l.id = r.user_id
initWhere : where r.location = "beijing"
initTargets : SELECT l.id, r.name
groupBy, window, orderBy, Distinct, Limit: NULL

生成PlanNode的相关的操作

通过initFrom, 生成的planNode 如下图所示:
- 1 renderNode, 代表整体的select语句
- 2 renderNode, 代表From内部的内容
- 3 joinNode, 代表 l join r
- 4 scan, 代表一个表或者索引

planNode 的结构

通过 initWhere, 重新修改 planNode,生成的新的 planNode 如下:
1,2,3,4 代表的意思不变。
- 5 filterNode,代表 where r.location = "beijing"
initWhere 后的planNode的结构

通过 initTarget, 重新修改 planNode ,增加ResultColumns信息,不需画图,可自行看代码。

optimizePlan内部内容

包含两个优化方向:
1. triggerFilterPropagation filter部分的下推等操作
2. expandPlan selection, sort optimization 等操作

上面的语句经过triggerFilterPropagation下推操作:

这里写图片描述

经过 expandPlan 省略,主要是通过sort的操作进行index的选取等。具体实例可以参考IndexMergeJoin

原创粉丝点击