(三)
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等等。
初始化过程如下:

图10:参数初始化过程图
Subplan的执行流程
以上示例中,子计划最终嵌入在父Plan的列信息表达式中。执行计划如下:
l 执行正常的t表fetch
l 执行投影操作时,将触发子计划的执行链,从ExecScan一直到ExecProject,最终调用到ExecScanSubPlan
l 在ExecScanSubPlan中,启动真正的子计划执行
l 获取所需的外部参数
l 直接遍历参数列表,并执行相应的执行表达式(因为在上一步,所需的执行表达式已经存储在state中)
结论
至此,我们完整的梳理了AntDB-T 子计划依赖参数的生成和执行流程,纵览生成流程,可以清晰的理解参数的优化过程;从执行流程上来看又可以完整了解参数的初始化,执行函数设置以及最后的执行位置和执行流程,对工作中进行SQL语句的子计划执行和调优起到了较好的帮助作用。
关于亚信安慧AntDB数据库
AntDB数据库始于2008年,在运营商的核心系统上,为全国24个省份的10亿多用户提供在线服务,具备高性能、弹性扩展、高可靠等产品特性,峰值每秒可处理百万笔电信核心交易,保障系统持续稳定运行近十年,并在通信、金融、交通、能源、物联网等行业成功商用落地。




