执行器-Query 执行详解

news2024/11/25 16:34:26

一、主要流程

本期主要为大家分享,在经过语法、词法分析并生成 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 流程完成。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/638897.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【哈希表part01】| 242.有效的字母异位词、349.两个数组的交集、202.快乐数、1.两数之和

目录 ✿LeetCode242.有效的字母异位词❀ ✿LeetCode349.两个数组的交集❀ ✿LeetCode202.快乐数❀ ✿LeetCode1.两数之和❀ ✿LeetCode242.有效的字母异位词❀ 链接:242.有效的字母异位词 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的…

如何进行弱网测试?专项测试中最实用的方法了解一下……

目录 引言 一、什么是弱网测试? 二、为何要进行弱网测试? 三、如何做弱网测试? 四、弱网测试工具 引言 如今这个高度互联的时代里,网络环境对于应用程序的影响越来越重要。 而弱网测试就是用来检验应用程序在恶劣网络环境下…

AIGC与AidLux互联应用——AidLux端AIGC评测

使用diffusers生成图片,再通过socket编程完成pc端与AidLux之间通信,把生成的图像上传服务端,最后通过yolov5模型对生成的图像进行评测 视频流程如下: AIGC与AidLux互联应用——AidLux端AIGC评测 生成图片如图所示:

Redis的Java客户端-Java客户端以及SpringDataRedis的介绍与使用

1. Redis的Java客户端 Spring Data Redis底层支持同时兼容Jedis和Lettuce两种不同的Redis客户端,可以根据需要任意选择使用其中的一种。这样既可以保留现有代码使用的Jedis方式,也可以通过使用基于Netty的高性能Lettuce客户端,提升应用的性能…

【RabbitMQ教程】前言 —— 中间件介绍

💧 【 R a b b i t M Q 教程】前言——中间件介绍 \color{#FF1493}{【RabbitMQ教程】前言 —— 中间件介绍} 【RabbitMQ教程】前言——中间件介绍💧 🌷 仰望天空,妳我亦是行人.✨ 🦄 个人主页——微风撞见云…

MySQL数据库基础 10

第十章 创建和管理表 1. 基础知识1.1 一条数据存储的过程1.2 标识符命名规则1.3 MySQL中的数据类型 2. 创建和管理数据库2.1 创建数据库2.2 使用数据库2.3 修改数据库2.4 删除数据库 3. 创建表3.1 创建方式13.2 创建方式23.3 查看数据表结构 4. 修改表4.1 追加一个列4.2 修改一…

Vue2模拟俄罗斯方块小游戏

目录 一、效果展示 二、代码分享 三、原理分析 3.1、界面搭建 3.2、方块创建 3.3、方块旋转 3.4、方块移动 3.5、移动判断 3.6、下落判断与清除 3.7、得分计算 一、效果展示 二、代码分享 <template><div class"game"><div class"ga…

调整IoTDB堆内存

最关键的是 MAX_DIRECT_MEMORY_SIZE &#xff0c;他等于MAX_HEAP_SIZE变量。 再往上翻又等于 max_heap_size_in_mb M大小 继续上翻 system_memory_in_mb 很明显就是系统内存&#xff0c;单位是M quarter_ 四分之一内存&#xff0c; half_ 一半内存。 假设物理内存为8G&a…

PMP证书含金量如何?到底有啥用处?

01PMP是什么&#xff1f; | PMP是指项目管理专业人士资格认证。 | 美国项目管理协会&#xff08;PMI&#xff09;举办的项目管理专业人员&#xff08;PMP&#xff09;认证考试。 | 是目前项目管理领域含金量很高的认证。 国内很多媒体也把PMP称为继MBA、MPA之后的三大金字招…

KW 新闻 | KaiwuDB 发布智慧矿山解决方案

5月21日&#xff0c;天津第七届世界智能大会&#xff08;WIC&#xff09;圆满落幕。作为智能领域的国家级盛会&#xff0c;WIC 汇聚了全球知名院士、顶级学者、产业领袖分享先进技术和实践经验&#xff0c;推进智能技术创新合作。KaiwuDB 受邀出席大会并正式发布智慧矿山解决方…

软件测试现状以及行业分析

大家都知道最近 ChatGPT 爆火&#xff0c;国外巨头争相宣布自己的相关计划&#xff0c;国内有点实力的企业也在亦步亦趋地跟进。不出意料的是&#xff0c;关于测试职业要被淘汰的话题又&#xff08;为什么要说又&#xff1f;&#xff09;在扎堆出现&#xff0c;内容跟之前还是大…

“大模型+小模型”新纪元开启,AI基础软件定义AI未来

5月30日&#xff0c;由中国信息通信研究院、浙江省经济和信息化厅、杭州市人民政府、中国人工智能产业发展联盟主办的“杭州通用人工智能论坛”盛大召开。杭州市人民政府党组成员、副市长孙旭东&#xff0c;浙江省经信厅总工程师李永伟&#xff0c;中国信息通信研究院党委副书记…

检索项目中冗余的图片

说在前面 平时在项目中我们会使用到一些图片&#xff0c;很多时候我们会直接将图片打包到项目中去&#xff0c;随着项目的更新迭代&#xff0c;我们可能会删除一些图片的引用&#xff0c;但没将图片源文件删除&#xff0c;这个时候没有被引用到的图片就会成为冗余的文件&#…

一位十年测试的修炼之路,希望能帮你点清现实

对于刚进入软件测试工作岗位的新人&#xff0c;如何快速、健康的在职业道路上成长&#xff0c;作者谈了几点自己看法&#xff1a; 1、兴趣是最好的老师 对于软件测试工作&#xff0c;通常是比较枯燥的&#xff0c;如果没有兴趣很难做到持久。 我最近参与了一个软件测试项目&a…

Android AIDL跨进程通信

一、前言 什么是AIDL&#xff1f;AIDL用来做什么的&#xff1f;怎么使用AIDL&#xff1f; AIDL是Android的一种接口定义语言&#xff0c;语法跟java接口定义类似&#xff0c;文件格式为 .aidl 非 .java 。AIDL主要是用来实现跨进程通信&#xff0c;AIDL的本质也是通过Binder机…

【集群】Haproxy搭建Web群集

文章目录 一、Haproxy 相关概念1. Haproxy 的概述2. Haproxy 的主要特性3. 常见的 Web 集群调度器4. 常见的应用分析4.1 LVS 应用4.2 Haproxy 应用4.3 LVS、Nginx、Haproxy的区别 5. Haproxy 调度算法原理5.1 roundrobin5.2 static-rr5.3 leastconn5.4 source5.5 uri5.6 url_pa…

【1 TypeScript - TypeScript语法的类型】

1 认识TypeScript 主要是为了解决类型检查的痛点.是拥有类型的JavaScript超集,虽然编写的是Typescript,但是最终仍然会编译成JavaScript代码. 2 TypeScript的运行环境 使用ts-node 3 变量的声明 变量的类型推导&#xff08;推断&#xff09; 4 JavaScript类型 – Array类…

ThinkPHP5源码阅读-类的自动加载register与autoload的实现

文章目录 前言如何下载ThinkPHP5源码关于自动加载类类的准备进入base.phpLoader::register() 注册自动加载函数对composer 的支持对think和trait的支持对extend目录的支持 类的加载autoload方法class_alias的定义和使用findFile 查找类 作业&#xff1a;自定义一个可以被自动类…

Java设计模式—责任链模式(Chin of Responsibility)

目录 前言 一、责任链模式的简介 二、责任链模式的概念 三、责任链模式的作用 四、责任链模式的优、缺点 1.责任链模式的优点 2.责任链模式的缺点 五、责任链模式的应用场景 六、代码案例 UML类图 1.定义一个请求枚举类 2.定义一个请求类 3.定义一个抽象处理接口 4、…

TS中any与unknown详解,示例

文章目录 前言一、一个示例二、示例目的1、功能描述2、主要区别3、代码实现 总结 前言 本片文章主要是在写ts时遇到不知道类型&#xff0c;很容易就想到用any可以解决一切&#xff0c;但这样写并不好。所以今天就总结学习一下&#xff0c;比较好的处理任意类型的unknown。 一、…