写点什么

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

作者:daydayup
  • 2023-07-24
    北京
  • 本文字数:1399 字

    阅读完需:约 5 分钟

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

二、执行流程


整个执行器的执行流程主要包括了策略选择模块 Portal、执行组件 executor 和 ProcessUtility,如图 3 所示。下面逐个进行介绍。



图 3 执行器总体执行流程


2.1 Portal 策略选择模块


Portal 是执行 SQL 语句的载体,每一条 SQL 对应唯一的 Portal,不同的查询类型对应的 Portal 类型也有区别,如表 2-1 所示。SQL 语句经过查询编译器处理后会生成优化计划树或非优化计划树,是执行器执行的“原子”操作,执行策略根据需要选择 SQL 的类型、调用相应的模块。Portal 的生命周期管理在 exec_simple_query 函数中实现,该函数负责 Portal 创建、执行和清理。Portal 执行的主要执行流程包括 PortalStart 函数、PortalRun 函数、PortalDrop 函数几个部分。其中 PortalStart 函数负责进行 Portal 结构体初始化工作,包括执行算子初始化、内存上下文分配等;PortalRun 函数负责真正的执行和运算,它是执行器的核心;PortalDrop 函数负责最后的清理工作,主要是数据结构、缓存的清理。


表 2-1 Portal 类型



数据库中的查询主要分为两大类,DDL(CREATE、DROP、ALTER 等)查询和 DML(SELECT、INSERT、UPDATE、DELETE)查询。这两类查询在执行器中的执行路径存在一定的差异。下面分别介绍这两类查询的主要函数调用关系。


2.2 ProcessUtility 模块


除了 DML 之外的所有查询,都通过 ProcessUtility 模块来执行,包括了各类 DDL 语句、事务相关语句、游标相关语句等。


DDL 查询的上层函数调用为 exec_simple_query 函数,其中 PortalStart 函数和 PortalDrop 函数部分较为简单。核心函数是 PortalRun 函数下层调用的 standard_ProcessUtility 函数,该函数通过 switch case 语句处理了各种类型的查询语句,调用关系如图 7-4 所示。包括事务相关查询、游标相关查询、schema 相关操作、表空间相关操作、表定义相关操作等。



图 4 DDL 查询主要函数调用关系


2.3 executor 模块


DML 会被优化器解析并产生成计划树。在执行阶段的上层函数调用和 DDL 类似,也是 exec_simple_query 函数。其中 PortalStart 函数会遍历整个查询计划树,对每个算子进行初始化。算子初始化函数的命名一般是“ExecInit+算子名”的形式,通过这种方式可以方便的查找到对应算子的初始化函数。初始化函数中首先会根据对应的 Plan 结构初始化一个对应的 PlanState 结构,这个结构是执行过程中的核心数据结构,包含了在执行过程中需要用的一些数据存储空间以及执行信息。


在 PortalRun 函数中会实际执行相关的 DML 查询,对数据进行计算和处理。在执行过程中,所有执行算子分为 2 大类,行存储算子和向量化算子。这两类算子分别对应行存储执行引擎和向量化执行引擎。行存储执行引擎的上层入口是 ExecutePlan 函数,向量化执行引擎的上层入口是 ExecuteVectorizedPlan 函数。其中向量化引擎是针对列存储表的执行引擎,会在 7.6 小节详细介绍。如果存在行存储表和列存储表的混合计算,那么行存储执行引擎和向量化执行引擎直接可以通过 VecToRow 和 RowToVec 算子进行相互转换。行存储算子执行入口函数的命名规则一般为“Exec+算子名”的形式,向量化算子执行入口函数的命名规则一般为“ExecVec+算子名”的形式;通过这样的命名规则,可以快速地找到对应算子的函数入口。


在 PortalDrop 函数中会调用 ExecEndPlan 函数对各个算子进行递归清理,主要是清理在执行过程中产生的内存。各个算子的清理函数入口命名规则是“ExecEnd+算子名”以及“ExecEndVec+算子名”,调用关系如图 5 所示。



图 5 DML 查询主要函数调用关系

用户头像

daydayup

关注

还未添加个人签名 2023-07-18 加入

还未添加个人简介

评论

发布
暂无评论
openGauss数据库源码解析系列文章——执行器解析(1.2)_opengauss_daydayup_InfoQ写作社区