共计 2209 个字符,预计需要花费 6 分钟才能阅读完成。
一、次要流程
本期次要为大家分享,在通过语法、词法剖析并生成 AST 语法树后的执行流程,下图是残缺流程展现:
图 1 整体流程图
一个 Query 语句执行,从 connExecutor 接管,再到解析实现的 AST 语法树,最初执行胜利返回后果,预计共要通过优化、生成逻辑打算、生成物理打算、分布式执行打算、收集后果返回 5 个步骤。
通过形象的例子来形容这项流程:“往年过节回家,回家的行程未确定”,“应该乘坐什么交通工具回到”等,这些便是咱们须要执行的语句。
语句解析后,由 connExecutor 接管语句,会生成一个初步打算,比方先坐火车,再转乘飞机,下飞机之后再坐客车回到家,这个初步打算可了解为逻辑打算。
确定初步打算,还须要确定具体打算,比方须要坐 xxx 次高铁到 xxx 地,转 xxx 班次 xxx 航班的飞机到 xxx 地,坐 xxx 号客车回家,这项具体打算可相当于物理打算。前面咱们依照具体打算执行,就相当于引擎执行物理打算,最初返回后果。
此篇文章次要介绍外围组件 connExecutor、逻辑打算和物理打算,为了不便大家了解,本文将通过围绕一条具体的 SQL 语句进行论述。
图 2 SQL 例句
二、外围组件
connExecutor 是执行器的外围数据结构,在后期通过音讯辨认和散发来解决来自客户的不同类型 SQL 语句,下图是例句的 stmt 对象:
图 3 例句 stmt 对象
connExecutor 负责查询处理来自于所给客户端的连贯申请,它应用了一个基于 PGsession 级语义的状态机,这个状态机用于对客户端的申请进行异步写操作,它从 stmtBuff 中承受输出的 statement,并通过 clientComm 接口进行后果的解决。
connExecutor 保护 stmtBuff 的游标,从而在同一时刻进行指令的执行和后果解决。这个游标总是指向正在解决的 statement。
而在游标生成前,相应 statement 的后果曾经产生,游标之后的 statement 就会被放在执行队列之中筹备被执行,connExecutor 还负责删除不再须要被执行的 statements。
connExecutor 具体有如下职责:
- 向执行引擎派发查问,通过辨认 stmtBuff 的协定类型并进行分类,再对不同类型,调用不同的执行办法,如图 1 中所示,对于数据库执行的语句,个别都是 execStmt 类型;
- 执行完结后,回复客户端查问后果;
- 保护连贯的状态机,状态机分为以下两个方向:
· 保护连贯的事务状态;
· 保护游标的地位。
三、逻辑打算
在数据库中,为实现执行语句的所有操作,数据库会把语句解析成一个个算子,每个算子别离执行语句,并组合成最初后果。
每个算子咱们称之为 planNode,逻辑打算实际上就是语句所需的所有算子组合成的树形构造。它在语法、语义解析后,构建物理打算执行前,为构建物理打算增加一些额定的表、列信息等。
在走优化时,逻辑打算会从优化后的 memo 转换成一个 planNode 的树状构造,不走优化或者不反对优化时,逻辑打算由 AST 间接转换,从下向上构建。
例句在生成逻辑打算时,因为其为 join 语句,会学生成一个 joinNode。在 joinNode 中,算子次要是存储连贯的后果,因而其上面的子算子才是真正执行的算子。
如果是嵌套 join,子算子仍可能是 joinNode,例句中 joinNode 下的子算子是两个 scanNode,scanNode 是解决扫描表的键 / 值对,并将它们从新结构为行的算子。例句的算子对象如图 4 所示:
图 4 算子对象
数据库大略通过几十个算子来笼罩语句的所有操作,下图列举了几个算子,此处不再一一赘述:
图 5 数据库算子
逻辑打算负责把对应的 relExpr(或者 AST)转换成对应的 planNode,包含 scanNode 中 tableDesc 的数据填充,其余 node 中 colDesc 的信息补充和 filter 过滤条件转化为 span 等过程。
创立逻辑打算前要构建 execBuilder.Build,此构造体次要包含三个局部: execFactory, memo, RelExpr。
其中 memo 和 RelExpr 是创立 memo 过程产生的。execFactory 中包含 planner,planner 贯通 SQL 的整个执行流程,其中包含构建 memo 中原数据用到的 schema 信息、table 信息等,最初后果存储在 planner 的 planTop 中。
图 6 builder 构造
通过数据库执行 EXPLAIN 命令查看执行语句的逻辑打算:
图 7 逻辑打算
或者在 AdminUI 语句页面能够看到执行语句的逻辑打算:
图 8 AdminUI 展现
四、物理打算
物理打算是依据逻辑打算生成的树型构造,在执行引擎理论查问时,即依照物理打算来进行的。
它依据逻辑打算中不同执行算子的节点生成,在构建物理打算时,会采纳分阶段 (stage) 的形式增加相应的 processor,实际上保留在 PhysicalPlan 构造体中的是处理器链路。
图 9 物理打算类图
在数据库执行 EXPLAIN ANALYSE 命令执行查问并生成具备执行统计信息的物理查问打算,例句物理打算如图 10 所示:
图 10 物理打算展现
例句的物理打算数据对象构造如下:
图 11 物理打算数据对象
flow 依据物理打算 processors 中的 nodeID 生成 flowSpec,例句的数据对象构造如下:
图 12 Flow 数据对象
物理打算生成之后,会依据 range 散布到各个 node 上执行,最终汇总后果,返回到客户端,一个 Query 流程实现。