关于数据库:执行器Query-执行详解

46次阅读

共计 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 具体有如下职责:

  1. 向执行引擎派发查问,通过辨认 stmtBuff 的协定类型并进行分类,再对不同类型,调用不同的执行办法,如图 1 中所示,对于数据库执行的语句,个别都是 execStmt 类型;
  2. 执行完结后,回复客户端查问后果;
  3. 保护连贯的状态机,状态机分为以下两个方向:
    · 保护连贯的事务状态;
    · 保护游标的地位。

三、逻辑打算

在数据库中,为实现执行语句的所有操作,数据库会把语句解析成一个个算子,每个算子别离执行语句,并组合成最初后果。

每个算子咱们称之为 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 流程实现。

正文完
 0