为了帮助同学们更高效地报名、参与比赛,我们将定期将同学们遇到的常见问题及解决方式同步到这里,如果同学们遇到问题,可优先从这里查找解决方案,如未找到解决方案,可以在大赛钉钉官方交流群进行提问,群号:35326455。
一、大赛基本信息
1、【赛程安排】
报名时间:即日起-10月25日 20:00
初赛:10月18日10:00-11月11日 18:00
决赛:11月15日-12月23日
现场答辩:2025年1月
2、大赛报名:OceanBase 社区
3、今年初赛已正式开启赛题已公布,初赛提测平台:
MiniOB-2024:OceanBase 社区
primary-2024-OceanBase-附加赛题:OceanBase 社区
4、初赛成绩及排名将在英雄榜实时更新,请大家及时关注:OceanBase 社区
5、大赛培训教程:OceanBase 社区
6、训练营使用说明:训练营使用说明
7、创建Github 私有仓库说明: https://oceanbase.github.io/miniob/game/github-introduction/
8、本次大赛答疑均在钉钉群进行,微信群仅作为重要通知提醒。请各位参赛同学尽快加入大赛钉钉答疑群(群号:35326455)
9、如果仍然有其他问题,也可参考往年 FAQ ( https://ask.oceanbase.com/t/topic/35605027)或在钉钉群内提问。
二、FAQ
0、我是小白,什么都不懂,不知道该怎么参赛?
目前有一些同学是第一次参加OceanBase 数据库大赛,可能之前没有参加过类似的比赛,对大赛一点概念都没有。这里通俗的介绍下如何参赛。参赛分为如下几个步骤:
- 报名。如果你看到了这里的介绍,今年(2024)大赛报名时间其实已经截止了,很遗憾不能参加本届(2024)年数据库大赛了,但仍然欢迎在我们的训练营参加日常练习(参考训练营使用说明:训练营使用说明 ),准备参加2025 年的大赛。
- 准备自己的开发环境。(假设到这里你已经完成了报名并填好了报名信息,如仓库地址等。如果对报名还有疑问,请参考下面的第一条【关于报名】)关于如何准备开发环境,这篇文档 https://oceanbase.github.io/miniob/dev-env/introduction/ 中已经介绍的十分详细,请先认真阅读,如果仍有疑问,欢迎在大赛交流群提问,也非常欢迎刚刚入门的选手分享自己准备开发环境的经验。
- 浏览赛题,理解赛题描述功能,写代码,实现题目要求的功能。如果不知道如何写代码,可以参考官方教程 OceanBase 社区 ,其中提供了两道题目的代码解析。
- 提交自己的代码(需要使用 git 命令提交代码,可参考 https://oceanbase.github.io/miniob/game/gitee-instructions/#git ),在训练营中提交测试(参考训练营使用说明 训练营使用说明 )。
- 根据训练营中返回的日志信息,继续修改自己的代码/提交测试。并不断重复这一过程,直到完成所有题目。
1、【关于报名】报名中指导老师必填么?指导老师的工作证指什么?代码仓库如何填写……
答:关于报名信息的填写,其中标红色*的信息为必填项,未标注的信息未选填信息,即有的话就填上,没有的话就无需填写。
学生证: 有的大一、研一的同学还没有下发学生证,那么上传能证明你是学生身份的证件均可,如录取通知书、校园卡等;
指导老师信息填写 :如果有指导老师就填写上,如果没有可不填写;指导老师的工作证,上传指导老师身份信息的资料即可,如职工卡亦可;
创建团队: 只有队长身份需要创建团队,队员加入队长所创建队伍即可;
组队 :队伍由1-3名成员组成,可以个人参赛,支持跨校、跨省进行组队;如需要找队友可以在大赛钉钉群、微信群中寻找,或联系OB社区小助手帮忙组队;
赛题仓库地址 :可以参考这个文档创建自己的 miniob 代码仓库,然后将自己代码仓库的URL填入 miniob 代码仓库即可: https://oceanbase.github.io/miniob/game/github-introduction/
对于oceanbase代码仓库的创建,文档中链接给出来的是miniob代码仓库的说明,创建自己oceanbase代码仓库的方法是类似的,将文档中的 miniob (oceanbase/miniob)换成 oceanbase (GitHub - oceanbase/oceanbase: OceanBase is an enterprise distributed relational database with high availability, high performance, horizontal scalability, and compatibility with SQL standards.) ,按照相同的方法创建,然后拿到自己oceanbase代码仓库的地址填入报名页。
2、【关于初赛】初赛的参赛形式是怎样的?初赛赛题什么时候公布?应该如何参赛?用什么软件参赛?初赛需要做完第一道题才能做第二道题吗?初赛得分是实时更新的么?比赛需要下载什么软件?
参赛形式 :初赛为线上参赛,通过相应赛题提测后会在英雄榜实时更新队伍得分,待初赛开始后,同学们可以在官网的英雄榜页面实时查看自己队伍的得分及排名;
初赛时间 :10月18日10:00-11月11日18:00。初赛赛题已公布,大家可以开始正式参赛啦~~~
初赛提测链接
MiniOB-2024:OceanBase 社区
primary-2024-OceanBase-附加赛题:OceanBase 社区
英雄榜:初赛成绩将在英雄榜实时更新,请大家及时关注:OceanBase 社区
提测&提测次数:团队成员可协作参赛,协作通过相应赛题提测即可,无需每个人都做一遍所有赛题。团队每位同学都能提测,每支队伍每日提测上限次数是10次,请同学们注意提测次数。
搭建开发环境:可参考文档:https://oceanbase.github.io/miniob/dev-env/introduction/#1
参赛建议 :赛题有简单、中等、困难三种难度的题目。建议大家前期可以先从简单的题型入手,循序渐进。
3、训练营的提示信息是什么意思?
训练营测试时,会向服务端发起SQL 请求,同时期望收到回复。每个SQL都会有期望的正确回复,与实际上收到的选手提测代码的回复。如果两者不一致,就认为case不通过,同时以"- " 前缀表示我们期望收到的正确答案,而 "+ " 表示收到的选手提测答案。
4、编译失败,提示找不到 文件:
/home/cmdgbb/miniob/deps/common/lang/span.h:13:10: fatal error: span: 没有那个文件或目录
13 | #include <span>
| ^~~~~~
gcc编译器版本低,请将 gcc 版本升级至gcc-10及以上,或使用较新的虚拟机环境(如 ubuntu22.04)。ubuntu 环境升级 gcc 版本可参考:https://cloud.tencent.com/developer/article/2033181
5、错误信息提示: failed to receive response from observer. reason=Failed to receive from server. poll return POLLHUP=16 or POLLERR=str(event & select.POLLERR), sql=
没有收到服务端的回复。测试程序会使用poll来探测服务端发来的消息,这里在探测时返回了异常,说明服务端通讯出现了异常(比如程序异常退出)。需要自行调试解决程序中的问题。调试方法可以参考:https://oceanbase.github.io/miniob/dev-env/miniob-how-to-debug/
这里已知有一下几种情况可能出现这一报错:
- 在程序 coredump 时,一般会生成 core文件,可以通过查看core 的堆栈来调试。
- 在客户端断连时,没有core文件。
- asan 检查到一些非法内存访问时。
6、在执行build.sh脚本时,遇到下面的错误:build.sh: line 2: $’\r’: command not found
通常是使用Windows电脑下载源码,然后在docker或虚拟机中运行build.sh脚本运行时出现这个错误。
解决方法:
执行下面的脚本,设置git不要切换换行符。
git config --global core.autocrlf false
然后删除源码重新下载(clone)。
问题原因:
在Windows上git clone源码后,文本文件(包括build.sh)换行符被修改为 ‘\r\n’(CRLF),这个换行符在Linux上不能识别,Linux的换行符是’\n’(LF)。
7、git clone https://github.com/oceanbase/miniob.git 时经常失败该怎么办?
可能是网络原因,可以尝试使用 git clone git@github.com:oceanbase/miniob.git
8、为什么训练营中输出结果显示我的输出结果和标准输出结果不一致,是不是标准输出结果有问题?
训练营的标准输出结果参考 MySQL 8.0 的输出结果,要求选手的执行结果与 MySQL 8.0 的输出结果保持一致。
9、浮点数处理异常
由于MySQL中对float字段的精度处理非常差,会遇到a < a的情况,比如 insert into t values(29.14);但是select * from t where id < 29.14;可以得到29.14这个数据。
另外还有比较长的浮点数,比如10356.23,在MySQL中会保存为10356.2,无法与miniob的要求保持一致,而且比较难找到一种规则。
如果同学们遇到上面的情况,可以在群内与我们沟通,来调整case,避免这种情况的发生。
10、SQL DEBUG如何使用
参考文档:https://oceanbase.github.io/miniob/game/debug-output/
11、客户端只能接受不超过4096字符的输入
在系统上安装readline开发包,然后重新编译。
在ubuntu上,是安装 libreadline-dev ,其它系统需要安装对应的包,即readline的开发包。
12、failed to run cmake
提测后训练营提示标题中的信息。
出现这个问题通常是由于你自己的代码仓库不完整或者格式与oceanbase/miniob 不一致导致的。
测试平台在拉取你的代码后,会执行 cmake 命令,这里提示 cmake 命令执行失败。
你可以拉取oceanbase/miniob 代码,push 到你自己的仓库,然后再测试。可以参考这篇文档。
最后注意,在代码仓库处理完成后,重新提测时,清理掉提测中的 “分支”和"commit id"信息,这时测试平台会拉取你代码仓库中默认分支的最新代码。
13、关于类型转换
虽然题目中没有明确要求支持类型转换,但是类型转换的运算是隐式的,对于类型转换的规则可以参考MySQL的文档。同学们可以在优先支持字符串与数字的算术运算、比较运算之后,如果遇到相关问题再实现。
14、在搭建docker 环境时遇到Client.Timeout exceeded while awaiting headers 的错误。
一般是由于网络原因,可以尝试其他的镜像源拉取镜像。
# 下面的命令三选一即可
docker pull oceanbase/miniob # pull from docker hub
docker pull ghcr.io/oceanbase/miniob && docker tag ghcr.io/oceanbase/miniob oceanbase/miniob # pull from github
docker pull quay.io/oceanbase/miniob && docker tag quay.io/oceanbase/miniob oceanbase/miniob # pull from github # pull from quay.io
15、git clone 时报错 unexpected disconnect
网络问题,可以多尝试几次,或者通过 ssh 的方式 clone 代码。例如:git clone git@github.com:oceanbase/miniob.git
16、向量数据库相关的题目该怎么实现?需要自己写算法代码还是引入外部库
不限制选手自己实现或引入外部库的方式。
17、为什么开赛才几天就有好几个高分甚至是满分选手了,感觉压力很大。
这些同学都是比较早就动手准备了。大家不用太过担心,初赛是入围赛,并不考察速度。而且初赛成绩并不影响决赛成绩,大家按自己的节奏参赛就可以了。
此外,大赛组委会有严格的代码审核机制,防止作弊等行为。也欢迎老师、同学们提供好建议,大家互相监督,共同维护一个公平、公正的比赛环境。
17、为什么在本地自测可以通过,在训练营上会失败/和我本地结果不一致。
可能有多种原因导致这个问题。
- 训练营使用 release版本测试,如果本地测试时使用debug 版本进行自测,可能某些结果与 release 不一致。
- 有同学反馈还可能是由于不太熟悉 git 操作,没有注意commit id,搞错了 commit id 导致。
- 还可以通过sql_debug 的方式调试输出某些训练营中的关键信息。参考第十条。
- 训练营中会使用 asan 检测内存错误,可以检查下自己本地是否开启了 asan,是否存在一些内存错误。
- 训练营使用 server-client 模式进行测试,而不是“直接执行命令的方式”
18、为什么我按照教程做 drop-table, date 这两道题时,代码和教程是一样的,但是结果有问题?
教程是准备的比较充分的,且经过了自测验证/绝大多数同学的实操。因此,教程本身是不存在正确性问题的。请尽量尝试自行解决,如重新完整的观看教程,通过debug/日志的方式调试,寻求队友的帮助(有时候可能是比较明显的bug,但是自己不易发现)
19、 为什么我按照官方提供的开发环境文档操作,会提示各种各样的问题。比如运行 .gen_parser.sh 报错等
miniob 的开发需要在Linux 环境中进行,因此请先确保自己是使用的 linux 开发环境,而不是 windows 环境。
20、为什么有些题目的输出的日志不完整,本地测试又是通过的。
本身日志数量是有限制的,不会无限输出日志。如果看到日志不完整一般是进行了大量的随机增删改查,可以在本地尝试构造大数据量进行测试。对于 big-order-by 有同学问到,是否除了order by 子句还有 where 子句。目前是只有order by 子句的,order by 子句中的属性比较多,所以显示不完整。
21、向量数据库的题目怎么没有测试用例?
可以参考文档(https://oceanbase.github.io/miniob/game/miniob-vectordb/),自行构造测试用例测试,或者结合训练营中提供的部分测试示例。
22、ann-benchmark 我本地可以通过,但是线上执行会超时,或者召回率/QPS 不满足要求?
无论是执行时间还是召回率,题目本身的限制其实是比较宽松的,因此,你的代码还有很大的优化空间。
23、为什么我之前的提交明明已经通过了,后来重新提交了一次又失败了。
一般是你自己的代码不够健壮。训练营的测试覆盖比较有限,不能认为训练营的测试通过了,代码就没有问题。训练营的测试程序每次运行都会生成一批随机数据用于测试,需要对于随机生成的数据可以稳定的输出与 mysql 一致的运行结果。
24、我在按照官方教程实现 date 类型时,会提示 check_date is not a member of ‘common’ 之类的错误。
在 date 类型实现教程中,没有展示 deps/common/time/datetime.h
文件的内容,需要在该文件中增加 check_date
函数声明。在 namespace common {
一行下增加 bool check_date(int y, int m, int d);
即可。
25、提测次数太少了,只有10次不够用
测试(自己构造测试用例,设计测试方法)本身也是一种能力的考察,本身提供的一些测试用例是仅供参考的,并不是说那些测试通过就证明的你的功能没有问题了(或者也可以说训练营的测试通过也不能完全证明你的功能没有问题)。并不是希望大家完全依赖训练营来做日常测试,测试自己的程序。训练营提测应该是当作自己功能实现完成,自测通过之后的一个“考试”。往年大赛也都是10次,暂时不做修改。
26、我使用了往年的代码来继续开发,但是出现了 XX 的问题。
不建议大家使用往年的代码继续比赛,最新的2024-competition 分支修复了若干已知的bug,且很多代码也做了重构,与以往代码有较大差异。建议大家更新到最新代码继续开发。
大赛微信交流群
2024大赛钉钉及交流群(群号:35326455)