随着国产数据库的发展越来越好,更多的DBA小伙伴也开始丰富自己的技术栈,学习新的国产数据库,作为一个入行不久的新人,除了立足本业之外,我也一直在关注国产数据库产品的发展。非常有幸,最近参加了“8小时玩转 openGauss 训练营第二期”活动,初步了解了一下华为出品的open gauss数据库。
open gauss是基于pg开发的一种国产关系型数据库管理系统 ,并且从2020年6月开始就已经开源了,并且开源协议是mulan PSL v2,就这一点,对于技术人员来说就非常值得称道。这表明open gauss 数据库不是一个封闭的产品,它欢迎广大开发者共享知识和力量的,并在积极的营造丰富的社区环境,在两天的培训中,首先就主讲老师就首先介绍了open gauss数据库开源的历程,并在最后一讲重点介绍了open gauss社区的发展情况,目前的体系架构包括社区技术委员会,社区用户组,企业和个人都可以签署CLA加入open gauss 社区,而且也推出了面向开发者的有奖资料捉虫活动。对于想要为open gauss共享力量的开发者,也可以直接注册gitee账号,为opengauss-bot提交issue反馈需求或bug。
印象比较深的是讲到opengauss sql命令的处理流程。
主要的流程步骤是客户端传入一条sql语句,然后链接到opengauss服务器上,从线程池中生成一个会话线程。
然后流程进入的是opengauss的SQL引擎,SQL引擎作为数据库系统的入口,主要承担了对SQL语言进行解析、优化、生成执行计划的作用,经过SQL引擎的一系列处置之后,在将执行计划交给执行引擎进行执行。
通常可以把SQL引擎分成SQL解析和查询优化两个主要的模块,opengauss的SQL引擎设计也是如此。
SQL解析部分分为:
词法分析:
openGauss采用flex和bison两个工具来完成词法分析和语法分析的主要工作。对于用户输入的每个SQL语句,它首先交由flex工具进行词法分析。flex工具通过对已经定义好的词法文件进行编译,生成词法分析的代码。
语法分析:
openGuass中定义了bison工具能够识别的语法文件gram.y,同样在Makefile中可以通过bison工具对gram.y进行编译,生成gram.cpp文件。
语义分析:
语义分析模块在词法分析和语法分析之后执行,用于检查SQL命令是否符合语义规定,能否正确执行。负责语义分析的是parse_analyze函数,位于analyze.cpp下。parse_analyze会根据词法分析和语法分析得到的语法树,生成一个ParseState结构体用于记录语义分析的状态,再调用transformStmt函数,根据不同的命令类型进行相应的处理,最后生成查询树。
查询优化模块主要分为
统计信息:
物理优化的依据,来源于表信息的统计。
行数估算:
代价估算的基础,来源于基表统计信息的推理。
代价估算:
根据关系的行数,推算出当前算子的执行代价。
路径搜索:
依据若干算子的执行代价,通过求解最优路径来进行路径搜索。
计划生成:
将查询的执行路径转换成planTree,能够输出给执行器进行查询执行。
执行引擎
关系数据库本身是对关系集合Relation的运算操作,执行引擎作为运算的控制逻辑主要是围绕着关系运算来实现的,算子可以分成以下几类:
扫描算子(Scan Plan Node):
扫描节点负责从底层数据来源抽取数据,数据来源可能是来自文件系统,也可能来自网络。一般而言扫描节点都位于执行树的叶子节点,作为执行的数据输入来源。典型代表SeqScan、IndexScan、SubQueryScan,关键特征:输入数据、叶子节点、表达式过滤
控制算子(Control Plan Node)
控制算子一般不映射代数运算符,是为了执行器完成一些特殊的流程引入的算子,例如Limit、RecursiveUnion、Union,关键特征:用于控制数据流程
物化算子(Materialize Plan Node)
物化算子一般指算法要求,在做算子逻辑处理的时候,要求把下层的数据进行缓存处理,因为对于下层算子返回的数据量不可提前预知,因此需要在算法上考虑数据无法全部放置到内存的情况,例如Agg、Sort,关键特征:需要扫描所有数据之后才返回
连接算子(Join Plan Node)
这类算子是为了应对数据库中最常见的关联操作,根据处理算法和数据输入源的不同分成MergeJoin,SortJoin,HashJoin。关键特征:多个输入
存储引擎
主要分为:事务管理器,锁管理器,缓冲区管理器,日志管理器,存储管理器,文件管理器,最后文件管理器从磁盘上读取数据。
小结:
作为一个新兴的数据库,opengauss使用很多新的技术,相较于oracle更加灵动,但也有非常强大的性能表现。让我眼前一亮的是opengauss很重视AI自治的特性,两天的讲座也有专门一场介绍了ai4DB和DB4ai相关的知识,通过这次讲座,我对数据库的日常运维也有了新的思考。