GaussDB技术解读——查询执行器
GaussDB技术解读——查询执行器
执行引擎负责查询的执行,在SQL执行栈中起到接受优化器生成的执行计划Plan、并对通过存储引擎提供的数据读写接口,实现对数据进行计算得到查询的结果集。
在分布式数据库中,执行引擎的范围还应包括节点间网络数据交换和传输的部分。
经典的执行模型:Tuple-At-A-Time模型(Volcano-Model)
数据库的执行是把查询的处理步骤抽象成独立的基础算子,然后由执行框架驱动算子迭代的方式执行,每个算子抽象成open()/next()/close()三种操作,上层算子通过嵌套调用下层的next()进行处理数据的返回,同样初始化的过程和结束过程也通过open()/close()嵌套调用,火山模型也是大多数传统数据库实现的执行模型。
计划节点
typedef struct Operator{ NodeTag ... /* input plan tree(s) */ struct Operator *lefttree; struct Operator *righttree; ...} Plan;
计划节点迭代执行
/* operator open 初始化操作 */State *exec_init_opr(state){ switch(nodeTag(state)) { ... }}/* operator next 执行操作 */Tuple *exec_process(plan){ switch(nodeTag(plan)) { case Scan: exec_scan(); case Join: exec_join(); // process state->left & righttree{ exec_proc_node(state->lefttree); exec_proc_node(state->righttree);} case Agg: exec_agg(); ... }}
/* operator close 结束操作 */void exec_deinit (state){ switch(nodeTag(state)) { ... }}
关系数据库本身是对关系集合Relation的运算操作,执行引擎作为运算的控制逻辑主题夜视仪围绕着关系运算来实现的,在传统数据库实现理论中,算子的分类可以分成以下几类:
1、扫描类算子(Scan Plan Node)扫描节点负责从底层数据来源抽取数据,数据来源可能是来自文件系统,也可能来自网络(分布式查询)。
一般而言扫描节点都位于执行树的叶子节点,作为执行数的数据输入来源,典型代表SeqScan、IndexScan、SubQueryScan关键特征:输入数据、叶子节点、表达式过滤
2、控制类算子(Control Plan Node)控制算子一般不映射代数运算符,是为了执行器完成一些特殊的流程引入的算子,例如Limit、RecursiveUnion、Union
关键特征:用于控制数据流程
3、物化算子(Materialize Plan Node)物化算子一般指算法要求,在做算子逻辑处理的时候,要求把下层的数据进行缓存处理,因为对于下层算子返回的数据量不可提前预知,因此需要在算法上考虑数据无法全部放置到内存的情况,例如Agg、Sort关键特征:需要扫描所有数据之后才返回
4、连接算子(Join Plan Node)这类算子是为了应对数据库中最常见的关联操作,根据处理算法和数据输入源的不同分成以下几种关键特征:
多个输入传统执行模型的优缺点
优点:逻辑清晰,可读性可维护性较好
缺点:由于存在大量的function call, instruction cache missing因此运行效率低
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)