# myGauss **Repository Path**: zhangdiandian/my-gauss ## Basic Information - **Project Name**: myGauss - **Description**: 第三届华为云GaussDB数据库挑战赛-复赛作品 - **Primary Language**: Java - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2021-10-14 - **Last Updated**: 2021-10-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 介绍 [第三届华为云GaussDB数据库挑战赛](https://competition.huaweicloud.com/information/1000041405/circumstance) - 复赛作品 # 1. 赛题背景 `openGauss`是一款开源关系型数据库管理系统,深度融合华为在数据库领域多年的经验,具有**高性能**(两路鲲鹏性能150万tpmC)、**高可靠**(故障切换时间RTO<10s)、**高安全**(端到端全方位安全防护)、**易运维**(基于AI的智能参数调优)的优势。 在高性能方面,由智能SQL引擎、多核NUMA优化、线程池、行列混存、LLVM、内存表等技术加持下,两路鲲鹏性能高达**150万tpmC**。 其中SQL引擎被誉为数据库的大脑,是提升性能的关键, 智能SQL引擎包含了**智能查询优化器**、**高性能执行引擎**。因此`本次大赛的题目是实现一个SQL引擎,能够高效实现单表查询,两表连接`。 # 2. 赛题描述 实现一个SQL引擎支持 - 表的建立 - 插入数据 - 建立索引 - 单表查询 - 两表查询 ## (1)建表: ``` sql CREATE TABLE table_name ( column1 data_type, column2 data_type, ... columnN data_type   ); ``` 说明: - 数据类型:data\_type仅用支持int , text长度1k以内。 - 列数量:N<=32 列 - 表名,列名长度不超过64字节。 ## (2)插入: ```sql  INSERT INTO table_name VALUES (v1, v2, ..., vn); ``` 说明: - 一次只支持插入一行数据。 - text类型需要用单引号包括。例如 'hello world' - 数据中不含NULL值。 - 数据都为英文,ASCII编码。 ## (3)索引: ```sql create index index_name on table_name(column_name); ``` 说明: - 仅支持一列索引,不支持组合索引。 ## (4)单表查询 ```sql  select col1, col2, ..., coln from table_name where col1=const and col2=col3 and const=col4; ``` 说明: - 只支持等值、非等值查询,不支持范围查询。 - 支持零个,一个或最多10个条件。 - 等值条件形式只有三种: 列=常量、常量=列, 列=列 - 布尔条件可以是and 、or - 列名的形式有三种:(1)*代表所有列 (2)column只出现列名 (3)table.column表名点列名的形式 - 列名的顺序任意,可以出现重复,都为表中的列。 - 测试用例的sql语义均合法。 ## (5)两表关联查询 ```sql  select t1.col1, t2.col2from t1, t2 where t1.col1=t2.col1and t1.col3=const and const=t2.col4; ``` 说明: - 支持零个,一个或最多10个条件。 - 连接条件最多只有一个。 - 最多有两张表。 - 不支持子查询等更复杂的SQL。 # 3. 赛题举例 ## (1)CASE1:全表查询 **input:** ```sql create table t1 (col1 int, col2 text); insert into t1 values(1, 'hello world'); select * from t1; ``` **output:** ``` hello world ``` 注意:如果有多列,每列输出以`|`分割,插入数据中不含`|`符号。 ## (2)CASE2:单表条件查询 **input:** ```sql create table t1 (col1 int); create index t1idx on t1(col1); insert into t1 values(1); insert into t1 values(2); insert into t1 values(3); select col1 from t1 where t1.col1=2; ``` **output:** ``` 2 ``` 注意:有多个条件,数据量较大的场景。 ## (3)CASE3:两表关联 **input:** ```sql create table t1 (col1 int); create table t2 (col1 int); insert into t1 values(1); insert into t2 values(1); select t1.col1 from t1,t2 where t1.col1=t2.col1; ``` **output:** ``` 1 ``` # 4. 排名规则 (1)**结果正确**,加对应case的分数。超时(3min)或报错不得分。 (2)**性能最优**,加对应case的时间。 ``` 提示: a. 高效实现索引 b. 高效实现多种自然连接算法(NestLoop,MergeJoin,HashJoin)。 c. 根据数据特征选择最优连接算法和连接顺序。 d. 利用SMP多核并行计算。 e. 利用SIMD并行计算指令集计算 ``` (3)**资源最少**,加对应case的内存用量。 排名依次按**分数**、时间、内存排序。`order by score desc, time asc, mem asc` # 5. 注意事项 本次参赛语言限定为C++/JAVA 赛题给出的SQL语句均合法,可以在openGauss跑过。 ## 资源使用限制 1. 每个用例执行的时间:3min 2. CPU使用限制:无限制,判定机器为8核CPU 3. 内存最大使用限制为:32G(top RES) 4. 磁盘使用限制:100G ## C++答题注意事项 (1)**选手代码写到一个文件中,命名为:gaussdb.cpp并上传** (2)判题系统调用g++ -O2 -lm –o gaussdb gaussdb.cpp 进行编译 (3)判题系统针对每个测试用例调用 gaussdb < case1.sql > case1.out 获取结果进行判定(从标准输入读取用例文件,结果输出到标准输出中) ## Java答题注意事项 (1)**选手代码写到一个文件中,命名为:Gaussdb.java并上传** (2)判题系统调用javac Gaussdb.java 进行编译 (3)判题系统针对每个测试用例调用java Gaussdb < case1.sql > case1.out 获取结果进行判定(从标准输入读取用例文件,结果输出到标准输出中)  `​注意:要求上传.java 或.cpp的文件,其他格式视为无效` ## 环境信息 ```bash  gcc --version  gcc (GCC) 4.8.5 20150623 (EulerOS 4.8.5-4) ``` ```bash  java -version  openjdk version "1.8.0_191"  OpenJDK Runtime Environment (build 1.8.0_191-b12)  OpenJDK 64-Bit Server VM (build 25.191-b12, mixed mode) ```