深入理解亚信安慧AntDB-T数据库子计划的执行流程
  OmM39SHr7olk 2023年12月22日 11 0


概要:

SQL语句在执行时会转换为执行计划,若其中包含了子查询或子链接并且不能被优化,则执行计划会生成子计划(查看AntDB的执行计划时看到标记为SubPlan[1] 的部分即为子计划)。在整个AntDB数据库中,子计划是SQL语句执行计划的重要组成部分,对执行计划的执行性能产生非常重要的影响。

一般子计划的执行依赖上层的执行结果作为输入参数,了解子计划如何获取上层Plan的参数传递,如何将执行的结果参数传递到上层以及子计划在AntDB数据库中如何执行等问题都是子计划执行流程和进行优化的关键点,本文将针对这些问题重点描述AntDB子计划的参数传递的设计和主要执行流程。



01什么是子计划

子计划在亚信安慧AntDB数据库中一般是通过查询SQL语句转换而来,以下是一个生成子计划的示例,一共有三张表,分别为t/t1/t2,其表结构如下:

深入理解亚信安慧AntDB-T数据库子计划的执行流程_数据库

图1:t/t1/t2表结构

表中数据如下:

深入理解亚信安慧AntDB-T数据库子计划的执行流程_服务器_02

图2:t/t1/t2表中示例数据

示例语句为:

SELECT c1, (SELECT i FROM t1 b WHERE b.j=(SELECT c.i FROM t2 c WHERE c.c4=a.c4)) i FROM t a;

通过explain解析的执行计划如下图:

深入理解亚信安慧AntDB-T数据库子计划的执行流程_服务器_03

图3:示例SQL执行计划

可以看到这里的SubPlan 2即是一个子计划,对应SQL语句中的(SELECT i FROM t1 b WHERE b.j=(SELECT c.i FROM t2 c WHERE c.c4=a.c4)) i 这部分,对外层依赖表t的c4字段。

InitPlan 1则是一个对外层无参数依赖的SubPlan,对应SQL语句中的SELECT c.i FROM t2 c WHERE c.c4=a.c4。

后续说明以此示例为参考。

02AntDB子计划的生成流程

深入理解亚信安慧AntDB-T数据库子计划的执行流程_服务器_04

图4:子计划关联部分数据结构

子计划生成主要需要两个数据结构:PlannerGlobal和PlannerInfo

PlannerGlobal的作用主要是在优化器对SQL语句的优化过程中记录全局信息,其中的subplans即用来记录所有的子计划,而paramExecTypes则用来记录参数的类型列表;

PlannerInfo的作用主要是对每层SQL语句进行分析使之生成对应的执行路径,同时将需要的参数等信息记录在plan_params中。

子计划主要的生成流程

子计划生成主要涉及到以下4个步骤:

1)当优化器开始工作时,首先会生成一个Plannerglobal数据结构的全局的glob对象,且在优化器对SQL语句分析过程中,所有生成的子计划都将保存在glob的subplans中;

2)其次对SQL语句的输出列,条件等进行表达式分析,如果SQL语句中包含有参数引用,那么最终会调用到参数分析assign_param_for_var函数进行参数的生成和记录;

3)接着根据优化信息和参数生成对应的SubPlan;

4)最后生成PlannedStmt,将PlannerGlobal的subplans转换到PlannedStmt的subplans字段中,方便后续的计划执行。

主体流程如下:

深入理解亚信安慧AntDB-T数据库子计划的执行流程_数据库_05

图5:生成子计划的主要流程图

步骤一:

优化过程中,会逐步调用到列、表达式分析函数preprocess_qual_conditions,而此函数最终会调用到参数分配函数assign_param_for_var,在此函数中分配子计划对上层依赖的参数全局paramId并放到PlannerInfo的plan_params中,此过程的主要流程又是在assign_param_for_var函数中完成的,其流程如下:

深入理解亚信安慧AntDB-T数据库子计划的执行流程_服务器_06

图6:生成参数的主要流程图

步骤二:

生成子计划(build_subplan)的流程:

深入理解亚信安慧AntDB-T数据库子计划的执行流程_服务器_07

图7:生成子计划流程图

此步骤中root->plan_params会在生成SubPlan时转换为Subplan的args。

步骤三:

最后在生成PlannedStmt时,将global的subplans放到PlannedStmt->subplans上,paramExecTypes则放到PlannedStmt-> paramExecTypes上。

从数据结构的角度看,相关优化数据转换过程如下图:

深入理解亚信安慧AntDB-T数据库子计划的执行流程_oracle_08

图8:子计划生成数据结构转换过程图

即最终的PlannedStmt上包含了subplans和paramExecTypes两种函数,subplans中又包含了记录参数信息的args列表,后续将根据这些信息开始执行Plan,最终输出的参数数据如下图所示:

深入理解亚信安慧AntDB-T数据库子计划的执行流程_初始化_09

图9:输出参数据结构及关系图

03

AntDB Subplan节点执行流程

Subplan的状态初始化

AntDB中所有的plan执行都需要先执行初始化操作,生成对应的state。

EState是执行器Executor的记录状态,EState->es_param_exec_vals被当作是子计划和外层交换数据的通讯“中介”,在执行器初始化时,根据执行计划的参数个数初始化es_param_exec_vals,为每个参数生成一个空间。

在standard_ExecutorStart函数初始化es_param_exec_vals后,将调用InitPlan进行Plan的状态初始化,InitPlan内部会对所有的subplan进行初始化。

ExecInitNode会调用到ExecInitSubplan,在subplan的初始化过程中,会根据subplan->args进行一对一初始化,如下图的ExecInitExprList函数按照调用顺序:

ExecInitExprList->ExecInitExpr->ExecInitExprRec

根据调用到的具体参数类型,设置相应的opcode和获取执行函数,如ExecJustConst、ExecJustScanVarVirt等等。

初始化过程如下:

深入理解亚信安慧AntDB-T数据库子计划的执行流程_初始化_10

图10:参数初始化过程图

Subplan的执行流程

以上示例中,子计划最终嵌入在父Plan的列信息表达式中。执行计划如下:

  • 执行正常的t表fetch
  • 执行投影操作时,将触发子计划的执行链,从ExecScan一直到ExecProject,最终调用到ExecScanSubPlan
  • 在ExecScanSubPlan中,启动真正的子计划执行
  • 获取所需的外部参数
  • 直接遍历参数列表,并执行相应的执行表达式(因为在上一步,所需的执行表达式已经存储在state中)

04结论

至此,我们完整的梳理了AntDB-T 子计划依赖参数的生成和执行流程,纵览生成流程,可以清晰的理解参数的优化过程;从执行流程上来看又可以完整了解参数的初始化,执行函数设置以及最后的执行位置和执行流程,对工作中进行SQL语句的子计划执行和调优起到了较好的帮助作用。

关于亚信安慧AntDB数据库

AntDB数据库始于2008年,在运营商的核心系统上,为全国24个省份的10亿多用户提供在线服务,具备高性能、弹性扩展、高可靠等产品特性,峰值每秒可处理百万笔电信核心交易,保障系统持续稳定运行近十年,并在通信、金融、交通、能源、物联网等行业成功商用落地。

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

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

暂无评论

推荐阅读
OmM39SHr7olk