暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

Gauss松鼠会 2021-08-27
1074

Gauss松鼠会

学习 探索 分享数据库知识 共建数据库技术交流圈

关注

本篇我们开启第七章执行器解析中“7.1 执行器整体架构及代码概览”、“7.2 执行流程”及“7.3 执行算子”的相关精彩内容介绍。完整版内容请查看CSDN·Gauss松鼠会专栏博客,以下内容为章节试读:

执行器在数据库整个体系结构中起到承上启下的作用,对上承接优化器产生的最优执行计划,并按照执行计划进行流水线式的执行,对底层的存储引擎中的数据进行操作。openGauss数据库将执行的过程抽象成了不同类型的算子,同时结合编译执行、向量化执行、并行执行等方式,组成了全面、高效的执行引擎。本章着重介绍执行器的整体架构、执行模型、各类算子、表达式,以及编译执行和向量化引擎等全新的执行引擎。

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

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

7.1.1  执行器整体结构

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

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

图7-1  执行器模块架构

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

7.1.2  火山模型

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

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

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

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

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

7.1.3  代码概览

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

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

表7-1 执行器源码目录

模块

功能

Makefile

编译脚本

codegen

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

executor

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

vecexecutor

向量化执行引擎

2) 执行器源码文件

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

表7-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连接
……(本节内容未完)
为提升您的阅读体验,完整版内容已运用专业格式发布到CSDN·Gauss松鼠会专栏,请扫码下方二维码,“关注”后进行内容阅读或点击文末“阅读原文”进入博客进行学习~

Gauss松鼠会
汇集数据库从业人员及爱好者
互助解决问题 共建数据库技术交流圈
完整版内容,请点击“阅读原文”
文章转载自Gauss松鼠会,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论