Oceanbase数据库大赛是阿里旗下的Oceanbase数据库开发人员联合华中科技大学举办的针对数据库开发初学者的一场比赛,涉及到数据库的底层实现。miniob则是一个小型数据库,只实现了一小部分基础功能,有一个整体的代码框架,要求参赛选手拓展出其他的功能,每一个功能根据不同的难度得相应的分数。

项目文档

miniob介绍

项目源码

往年参赛选手心得

项目总览

(来源于官方文档,我觉得我写的没有文档好,所以不费笔墨了)

miniob作为一个具有“基本”功能的数据库,包含了需要的基本功能模块。包括

  • 网络模块:负责与客户端交互,收发客户端请求与应答;
  • SQL解析:将用户输入的SQL语句解析成语法树;
  • 执行计划缓存:执行计划缓存模块会将该 SQL第一次生成的执行计划缓存在内存中,后续的执行可以反复执行这个计划,避免了重复查询优化的过程(未实现)。
  • 语义解析模块:将生成的语法树,转换成数据库内部数据结构(部分实现);
  • 查询缓存:将执行的查询结果缓存在内存中,下次查询时,可以直接返回(未实现);
  • 查询优化:根据一定规则和统计数据,调整/重写语法树。当前实现为空,留作实验题目;
  • 计划执行:根据语法树描述,执行并生成结果;
  • 会话管理:管理用户连接、调整某个连接的参数;
  • 元数据管理:记录当前的数据库、表、字段和索引元数据信息;
  • 客户端:作为测试工具,接收用户请求,向服务端发起请求。

SQL的执行流程可以参考

SQL 请求执行流程

参赛感受

虽然抄底拿奖,但还是收获了不少项目经验,例如利用WSL进行linux开发、git维护代码版本、vscode结合GDB、ssh remote远程开发调试等等,由于没有提前准备,只有两周的时间,刚上手感觉非常吃力,因为从来没有独立做过这么大的项目,配置环境就花了我两天的时间,主要是之前没有用vscode进行过项目开发,一直在用vs2019,怎么通过插件连接服务器,怎么结合GDB调试,怎么配置launch.json和task.json,还有sourtree如何连接到WSL,这些都是一点一点摸索出来的,在这个过程学习到了很多东西,例如launch.json和task.json中每个变量的含义,vscode运行代码的原理等。

环境配置好入手项目也不是一件易事,首先就是词法和语法解析,我没有学习过编译原理,第一次接触这样的概念,查阅各种flex和bison的资料,得知了两个文件的编写规范,由于是以得分为目的,并没有深究其原理,这两个工具确实很厉害,然后就是阅读源码中各种数据结构,把sql中各种东西都封装成对象,例如create、select这种语句,这些语句中可能涉及到哪些参数,这些参数就是成员变量,这些成员变量可能与其他什么数据结构产生联系,再通过成员函数进行连接,我越来越佩服开发人员,可以如此复杂的sql模块化,模块与模块直接耦合度还这么低,如何拓展代码的情况下不破坏原来的结构,这是每个参赛者都必须考虑的问题,显然我实力不够,我只能在他们的数据结构上添加冗余的东西,以快速拿分,虽然也没拿到分,重庆是个水区,60分就可以进省3,10月20号的时候重邮拿到了60分,之后就再也没动过,因此在我拿到50分的时候信心大增,感觉可以冲一波前三,但是很快就被打脸了,最后一题实现聚合函数确实很难,正常来说是要重新设计一个数据结构来存放聚合函数的参数的,但是我实力太弱,只能在属性数据结构上动手脚,效果也很明显,很快就写好解析了,但是问题就是后面resolver、executor、tuple等与属性相关的数据结构都要修改,从项目开发的角度来看,这真是糟糕透了,因为这违背了扩展原则,但是没办法我只会这么做,改出一版代码,测试各种数据都没有问题,交上去之后就错了,难受的是只能看到一部分测试数据,在我本地看来,反馈的错误数据是可以跑通的,不知道哪里出错,也就无从改之,无奈,我止步于此。

总体而言,虽然从比赛的角度看,我由于是solo,没有项目经验,所以特别吃力,还有最后有个名次,我也收获了许多项目经验,也不枉这两周的修行。