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

概要:

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

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

01什么是子计划

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

图片

图1:t/t1/t2表结构

表中数据如下:

图片

图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解析的执行计划如下图:

图片

图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子计划的生成流程

图片

图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字段中,方便后续的计划执行。

主体流程如下:

图片

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

步骤一:

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

图片

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

步骤二:

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

图片

图7:生成子计划流程图

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

步骤三:

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

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

图片

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

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

图片

图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等等。

初始化过程如下:

图片

图10:参数初始化过程图

Subplan的执行流程

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

  • 执行正常的t表fetch

  • 执行投影操作时,将触发子计划的执行链,从ExecScan一直到ExecProject,最终调用到ExecScanSubPlan

  • 在ExecScanSubPlan中,启动真正的子计划执行

  • 获取所需的外部参数

  • 直接遍历参数列表,并执行相应的执行表达式(因为在上一步,所需的执行表达式已经存储在state中)

04结论

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

关于亚信安慧AntDB数据库

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/240304.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

现代C++ 实现单例模式

传统写法有什么问题 如果你了解过单例模式,双重检查锁定模式(Double-Checked Locking Pattern,后文简称DCLP)的写法你一定不会陌生,甚至你或许认为它是最正确的代码。 class Singleton { public://获取单例Singleton…

MySQL 8.x temp空间不足问题

目录 一、系统环境 二、问题报错 三、问题回顾 四、解决问题 一、系统环境 系统Ubuntu20.04 数据库版本MySQL 8.0.21 二、问题报错 在MySQL上执行一个大的SQL查询报错Error writing file /tmp/MYfd142 (OS errno 28 - No space left on device) Exception in thread …

用C语言实现链队列的基本操作

不多解释&#xff0c;直接上代码&#xff0c;代码已经写了注释&#xff01; //队列链式结构的基本操作&#xff1a; #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> typedef int QueueElememtType; typedef struct QNode//链队的定义 {…

什么是蜘蛛池,蜘蛛池是什么蚂蚁SEO

蜘蛛池是一种通过大量模拟真实用户行为来提升网站搜索引擎排名的技术。这种技术利用大量的网络爬虫程序&#xff0c;模拟搜索引擎蜘蛛的爬行行为&#xff0c;通过大量的模拟爬行和页面抓取&#xff0c;提高网站的权重和排名。 如何联系蚂蚁seo&#xff1f; baidu搜索&#xf…

如何查看自己的文章是否被数据库收入?【查收查引】

致谢&#xff1a;特别感谢图书馆的蔡老师&#xff0c;告诉我怎么操作&#xff01; 另外&#xff0c;查收查引报告中的文章可以分开开&#xff0c;放在一起开不是必须的。&#xff08;放在一起开大概是院士工作量需要的。不是很了解。&#xff09; 如何查看自己的文章是否被数据…

杰发科技AC7840——CAN通信简介(1)

简介 7840支持4路CAN-FD Demo调试 官网下载demo&#xff0c;烧录&#xff0c;打开串口发现打印如下。原因是没有连接CAN盒子&#xff0c;总线错误。 CAN收发器端波形 CAN_L有信号&#xff0c;CAN_H没有 波形放大 GPIO端波形 有持续波形输出 波形放大查看&#xff0c;有50U…

.NET 反射优化的经验分享

比如针对 GetCustomAttributes 通过反射获取属性的优化,以下例子 // dotnet run -c Release -f net7.0 --filter "*" --runtimes net7.0 net8.0public class Tests{public object[] GetCustomAttributes() => typeof(C).GetCustomAttributes(typeof(MyAttribute…

如何快速将图片转为excel?

一、打开金鸣表格文字识别软件。 二、点击添加文件按钮&#xff0c;在打开的窗口中选择目标图片&#xff0c;然后点击“打开”&#xff0c;将图片添加进待识别的列表中。 三、点击提交识别或识别全部。 四、识别完成后点击“打开文件”即可打开识别好的结果文件&#xff08;EXC…

Enabling Application Engine Tracing 启用应用程序引擎跟踪

Enabling Application Engine Tracing 启用应用程序引擎跟踪 By default, all Application Engine traces are turned off. To see a trace or a combination of traces, set trace options before you run a program. 默认情况下&#xff0c;所有应用程序引擎跟踪都处于关闭…

Python学习笔记(四):函数的定义、函数的返回值、None类型、函数说明文档、函数的嵌套调用、局部变量、全局变量、global关键字

目录 一、函数介绍 1. 函数是&#xff1a; 2. 使用函数的好处是&#xff1a; 二、函数的定义&#xff1a; 三、函数的参数 1.传入参数的功能是&#xff1a; 2.函数的传入参数 - 传参定义 3.注意事项&#xff1a; 4.练习&#xff1a;测量体温 四、函数的返回值 1.函数…

宇视科技视频监控 main-cgi 文件信息泄露漏洞

宇视科技视频监控 main-cgi 文件信息泄露漏洞 一、产品简介二、漏概述三、复现环境四、漏洞检测手工抓包自动化检测 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#…

【毕业设计】STM32单片机水质PH值电导率TDS超声波水位检测

1、合集资料汇总&#xff08;部分&#xff09; 2、功能 本系统由STM32单片机核心板、超声波测距模块、PH值传感器模块、电导率传感器、LCD1602液晶及电源组成。 1、超声波传感器采集探测距离&#xff0c;PH传感器采集PH值&#xff08;PH传感器需要根据手册校准&#xff09;&a…

阿里云国际版无法远程连接Windows服务器的排查方法

如果您遇到紧急情况&#xff0c;需要尽快登录Windows实例&#xff0c;请参见以下操作步骤&#xff0c;先检查ECS实例的状态&#xff0c;然后通过云助手向Windows实例发送命令或通过VNC登录实例&#xff0c;具体步骤如下&#xff1a; 步骤一&#xff1a;检查ECS实例状态 无论何…

【Delphi】FMX开发 ios 和 android 异同点(踩坑记)

目录 一、前言 二、补充下基础知识 1. APP程序事件&#xff1a;TApplicationEvent 2. APP内置Web服务器或者UDP服务端或者TCP服务端 三、iOS 和 android 平台的不同点 1. TApplicationEvent的不同点&#xff1a;以下不同点&#xff0c;请仔细阅读&#xff01; 2. APP内置…

yarn或者pnpm第一次执行的时候遇到报错yarn : 无法加载文件......因为在此系统上禁止运行脚本

报错&#xff1a; yarn : 无法加载文件 C:\Users\rina2\AppData\Roaming\npm\yarn.ps1&#xff0c;因为在此系统上禁止运行脚本。有关详细信息&#xff0c;请参阅 https:/http://go.microsoft.com/fwlink/?LinkID135170 中的 about_Execution_Policies。 解决方案&#xff1a…

华清远见嵌入式学习——QT——作业4

作业要求&#xff1a; 代码运行效果图&#xff1a; 代码&#xff1a; 头文件&#xff1a; #ifndef ALARMCLOCK_H #define ALARMCLOCK_H#include <QWidget> #include <QTimerEvent> #include <QTimer> #include <QTime> #include <QTextToSpeech&g…

华为OD试题二(文件目录大小、相对开音节、找最小数)

1. 文件目录大小 题目描述&#xff1a; 一个文件目录的数据格式为&#xff1a;目录id&#xff0c;本目录中文件大小&#xff0c;(子目录id 列表)。其中目录id全局唯一&#xff0c;取值范围[1,200]&#xff0c;本目录中文件大小范 围[1,1000]&#xff0c;子目录id列表个数[0,10…

Java的NIO工作机制

文章目录 1. 问题引入2. NIO的工作方式3. Buffer的工作方式4. NIO数据访问方式 1. 问题引入 在网络通信中&#xff0c;当连接已经建立成功&#xff0c;服务端和客户端都会拥有一个Socket实例&#xff0c;每个Socket实例都有一个InputStream和OutputStream&#xff0c;并通过这…

云基础软件深化合作,云轴科技ZStack与麒麟软件战略签约

12月8日&#xff0c;云轴科技ZStack与麒麟软件战略合作签约仪式在北京举行&#xff0c;双方对过往紧密合作表达了充分肯定&#xff0c;并就进一步联合技术创新、打造重点行业标杆和持续赋能客户达成高度共识。云轴科技创始人&CEO张鑫和麒麟软件高级副总经理谢文征共同见证双…

高通平台开发系列讲解(USB篇)Composite USB gadget framework

文章目录 一、Gadget framework二、Composite driver and gadget driver interaction沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇章主要图解高通平台PCIe EP软件架构 一、Gadget framework Composite USB gadget framework 架构如下所示: The composite fram…