openGauss数据库源码解析系列文章——执行器解析(1.1)
  lYE0sTgD5uUi 2023年11月02日 30 0

openGauss数据库源码解析系列文章——执行器解析(1.1)

一、执行器整体架构及代码概览

本节整体介绍执行器的架构和代码。

1.1 执行器整体结构

在SQL引擎将用户的查询解析优化成可执行的计划之后,数据库进入查询执行阶段。执行器基于执行计划对相关数据进行提取、运算、更新、删除等操作,以达到用户查询想要实现的目的。

openGauss在行计算引擎的基础上,增加了编译执行引擎和向量化执行引擎,执行器模块架构如图1-1所示。openGauss的执行器采用的是火山模型(volcano model),这是一种经典的流式迭代模型(pipeline iterator model),目前主流的关系型数据库大多采用这种执行模型。

openGauss数据库源码解析系列文章——执行器解析(1.1)_位图

图1 执行器模块架构

执行器包括四个主要的子模块:Portal、ProcessUtility、executor和特定功能子模块。首先在Portal模块中根据优化器的解析结果,选择相应的处理策略和处理模块(ProcessUtility和executor)。其中executor主要处理用户的增删改查等DML(Data Manipulation Language,数据操作语言)操作。然后ProcessUtility处理增删改查之外的其他各种情况,例如各类DDL(data definition language,数据定义语言)

1.2 火山模型

执行器(executor)的输入是优化器产生的计划树(plan tree),计划树经过执行器转换成执行状态树。执行状态树的每一个节点对应一个独立算子,每个算子都完成一项单一功能,所有算子组合起来,实现了用户的查询目标。在火山模型中,多个算子组成了一个由一个根节点、多个叶子节点和多个中间节点组成的查询树。

每个算子有统一的接口(迭代器模式),从下层的一个或者多个算子获得输入,然后将运算结果返回给上层算子。整个查询执行过程主要是两个流,驱动流和数据流。

驱动流是指上层算子驱动下层算子执行的过程,这是一个从上至下、由根节点到叶节点的过程,如图7-2中的向下的箭头所示。从代码层面来看,即上层算子会根据需要调用下层算子的函数接口,去获取下层算子的输入。驱动流是从跟节点逐层传递到叶子节点。

数据流是指下层算子将数据返回给上层算子的过程,这是一个从下至上,从叶节点到跟节点的过程,如图1-2中的向上的箭头所示。在openGauss中,所有的叶子节点都是都是表数据扫描算子,这些节点是所有计算的数据源头。数据从叶子节点,通过逐层计算,然后从根节点返回给用户。

openGauss数据库源码解析系列文章——执行器解析(1.1)_位图_02

图2 执行器控制流和数据流示意图

1.3 代码概览

执行器在项目中的源代码路径为:src/gausskernel/runtime。下面是执行器的源码目录。

1) 执行器源码目录

执行器源码目录如表1-1所示。

表1-1 执行器源码目录

模块

功能

Makefile

编译脚本

codegen

计划编译,加速热点代码执行

executor

执行器核心模块,包括表达式计算、数据定义处理以及行级执行算子

vecexecutor

向量化执行引擎

2) 执行器源码文件

执行器源码目录为:src/gausskernel/runtime/模块名。文件如表1-2所示。

表1-2 执行器源码文件

模块名

源码文件

功能

codegen

codegenutil

编译执行辅助工具

executor

执行器


llvmir

llvm表达式生成


vecexecutor

向量化引擎


Makefile

编译配置文件


executor

Makefile

编译配置文件

execAmi.cpp

执行器路由算子


execCurrent.cpp

节点控制


execGrouping.cpp

支持分组、哈希和聚集操作


execJunk.cpp

伪列的支持


execMain.cpp

顶层执行器接口


execMerge.cpp

处理MERGE指令


execProcnode.cpp

分发函数按节点调用相关初始化等函数


execQual.cpp

评估资质和目标列表的表达式


execScan.cpp

通用的关系扫描


execTuples.cpp

元组相关的资源管理


execUtils.cpp

多种执行相关工具函数


functions.cpp

执行SQL语言函数


instrument.cpp

计划执行工具


lightProxy.cpp

轻量级执行代理


nodeAgg.cpp

聚合算子


nodeAppend.cpp

添加算子


nodeBitmapAnd.cpp

位图与算子


nodeBitmapHeapsScan.cpp

位图堆扫描算子


nodeBitmapIndexScan.cpp

位图扫描算子


nodeBitmapOr.cpp

位图或算子


nodeCtescan.cpp

通用表达式扫描算子


...

...


README

说明文件


vecnode/vecagg.cpp

向量聚合算子


vecnode/vecappend.cpp

向量添加算子


vecnode/vecconstraints.cpp

约束检查


vecnode/veccstore.cpp

列存扫描算子


vecnode/veccstoreindexand.cpp

列存索引扫描算子


vecnode/veccstoreindextidscan.cpp

列存tid扫描算子


...

...


vecnode/Readme.md

说明文件


vecprimitive/date.inl

基础数据类型


vecprimitive/float.inl

浮点数据类型


vecprimitive/int4.inl

4字节整数类型


vecprimitive/int8.inl

8字节整数类型


vecprimitive/numeric.inl

数值类型


...

...


vecprimitive/Readme.md

说明文件


vectorsonic/vsonicfilesource.cpp

读写加速


vectorsonic/vsonicchash.cpp

Hash加速


vectorsonic/vsonichashagg.cpp

Hash聚合


vectorsonic/vsonichashjoin.cpp

Hash连接


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  gBkHYLY8jvYd   2023年12月09日   26   0   0 cii++数据
lYE0sTgD5uUi