8000 improve docs by nautaa · Pull Request #553 · oceanbase/miniob · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

improve docs #553

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
May 7, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions docs/docs/db_course_lab/lab1.md
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,7 @@ while(true) {
```

注意:

1. 在实现 `insert_concurrently()` 请不要使用任何锁。
2. 需要考虑 `common::RandomGenerator` 的线程安全。可参考:https://stackoverflow.com/questions/77377046/is-a-stdmt19937-static-function-variable-thread-safe

Expand Down Expand Up @@ -249,6 +250,7 @@ Compaction 的触发条件是某个 Level 的 SSTable 数量超过了阈值,
**提示**:除了本文中提到的需要修改的位置,你还可能需要完成其他必要的修改以支持 Leveled Compaction 正常运行,请自行 debug 或查看相关代码文件。

ObLsm 中的 Leveled Compaction 需要满足下面规则:

1. 磁盘上的文件按多个层级(Level)进行组织。我们称它们为1级、2级等,或简称为L1、L2等,层级数由`ObLsmOptions::default_levels` 指定。特殊的 level-0(或简称 L0)包含刚刚从内存写入缓冲区(memtable)刷新的文件。
2. 每个级别( L0 除外)都仅包含一个 Sorted Run(相同层级的 SSTable 之间 Key 范围不存在交集)。
3. 每个层级(L1 及以上)之间的数据大小存在倍数关系:`L_{i+1} = L_{i} * k`,其中 k 由`ObLsmOptions:: 8000 default_level_ratio` 指定,L1 层级的数据大小由`ObLsmOptions::default_l1_level_size` 指定。
Expand Down
17 changes: 16 additions & 1 deletion docs/docs/db_course_lab/lab2.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,16 @@ title: LAB#2 查询引擎

# LAB#2 查询引擎

每次实验代码更新,需要将代码从远端仓库拉取下来,大家需要从 miniob 的 github 仓库上把代码拉取到本地。

```
1. git remote add origin_ob https://github.com/oceanbase/miniob.git
2. git pull origin_ob
3. git merge origin_ob/main
4. 解决git冲突
5. 实现代码,推送到自己的github仓库上
```

在数据库系统实现原理与实践课程的 [LAB#1](lab1.md) 中,你已经完成了数据库系统中的存储引擎(基于 LSM-Tree 的存储引擎)。在这个实验中,你将实现数据库系统中的查询引擎(基于 MiniOB)。你需要根据此文档的指导,完成 MiniOB 查询引擎中的语法解析,查询优化,查询执行等模块。

## 实验
Expand Down Expand Up @@ -91,6 +101,7 @@ set hash_join=1;
```

**提示**

- 你的修改可能不止包含 `src/observer/sql/operator/hash_join_physical_operator.h/.cpp` 中的代码。
- 可以参考 Nested Loop Join 算子的实现。
- 需要实现 INNER JOIN 语法,并将 `INNER JOIN table ON expr` 中的条件表达式 `expr` 放到 `Hash Join` 算子中,支持 `expr` 中包含单个等值条件即可。
Expand All @@ -117,6 +128,7 @@ set hash_join=1;
MiniOB 中的 `Cascade Optimizer` 设计文档可参考 `src/observer/optimizer/cascade/README.md`, MiniOB 中的实现主要参考了 [columbia](https://github.com/yongwen/columbia) 和 [noisepage](https://github.com/cmu-db/noisepage) 的实现。

关于 cascade 优化器原理的更多细节可以参考相关论文:

1. [cascade 论文](https://15721.courses.cs.cmu.edu/spring2016/papers/graefe-ieee1995.pdf)
2. [columbia 论文](https://15721.courses.cs.cmu.edu/spring2019/papers/22-optimizer1/xu-columbia-thesis1998.pdf)

Expand All @@ -138,7 +150,8 @@ SELECT * FROM tbl1, tbl2, tbl3 WHERE tbl1.a = tbl2.a AND tbl2.a > tbl3.a AND tbl
```
上述语句中,`tbl3.a > 100` 可以下推到 tbl3 对应的 TableScan 算子中,`tbl2.a > tbl3.a` 和 `tbl1.a = tbl2.a` 可以下推到对应的 Join 算子中。

提示:
**提示**

- 不需要考虑 OR 条件。
- 谓词下推的规则在 `src/observer/sql/optimizer/predicate_to_join_rule.h` 中实现。
- 部分测试用例可参考 `test/case/test/dblab-optimizer.test`
Expand All @@ -149,6 +162,7 @@ SELECT * FROM tbl1, tbl2, tbl3 WHERE tbl1.a = tbl2.a AND tbl2.a > tbl3.a AND tbl
你需要基于 Cascade Optimizer(主要代码位于 `src/observer/sql/optimizer/cascade` 中)实现 Join 物理算子选择,即选择 HashJoin 或 NestedLoopJoin 作为 Join 算子的物理算子。你需要根据参与Join 表的基数和谓词条件来计算两个算子的代价,并选择代价较低的 Join 物理算子。

代价计算规则如下:

1. NestedLoopJoin 算子的代价计算公式如下:
$$
cost_{nlj} = left \times right \times CPU + output \times CPU
Expand All @@ -162,6 +176,7 @@ $$
其中,left 表示左边算子的基数,right 表示右边算子的基数,hash_cost 表示构建阶段的一次插入哈希表操作的代价,hash_probe 表示探测阶段一次探测(probe)的代价,output 表示输出的基数,CPU 表示一次 CPU 操作的代价。

**提示**

- 可参考 `src/observer/sql/optimizer/cascade/README.md` 文档添加新的转换规则。
- 需要先完成任务2 以及谓词条件下推改写规则。
- 请不要修改 `src/observer/sql/optimizer/cascade/cost_model.h`
Expand Down
25 changes: 15 additions & 10 deletions docs/docs/db_course_lab/lab3.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,19 @@ title: LAB#3 事务引擎
---

> 请不要将代码提交到公开仓库(包括提交带有题解的 Pull Request),同时也请不要抄袭其他同学或网络上可能存在的代码。
>
> 每次实验代码更新,需要将代码从远端仓库拉取下来,大家需要从 miniob 的 github 仓库上把代码拉取到本地。
>
> 1. git remote add origin_ob https://github.com/oceanbase/miniob.git
> 2. git pull origin_ob
> 3. git merge origin_ob/main
> 4. 解决git冲突
> 5. 实现代码,推送到自己的github仓库上

# LAB#3 事务引擎

每次实验代码更新,需要将代码从远端仓库拉取下来,大家需要从 miniob 的 github 仓库上把代码拉取到本地。

```
1. git remote add origin_ob https://github.com/oceanbase/miniob.git
2. git pull origin_ob
3. git merge origin_ob/main
4. 解决git冲突
5. 实现代码,推送到自己的github仓库上
```

在数据库系统实现原理与实践课程的 [LAB#1](lab1.md),[LAB#2](lab2.md) 中,你已经完成了数据库系统中的存储引擎(基于 LSM-Tree 的存储引擎),查询引擎(实现查询算子,优化执行计划等)。在这个实验中,你需要为 LAB#1 中实现的 LSM-Tree 存储引擎支持事务,同时支持数据库的持久化和恢复。你需要根据此文档的指导,完成事务引擎以及数据库的持久化和恢复。

## 实验
Expand Down Expand Up @@ -57,6 +59,7 @@ RC update_record_with_trx(const Record &old_record, const Record &new_record, Tr
你可以通过开启多个 obclient 测试 MiniOB 中的事务。

**提示** 测试过程中,需要在启动 observer 时指定存储引擎为lsm,事务类型为lsm。即 `-E lsm -t lsm`

**测试用例示例**
```
client 1: client 2:
Expand All @@ -78,7 +81,9 @@ commit;
```

**提示** 你需要实现快照隔离(Snapshot Isolation)级别的 MVCC 事务。

**提示** 事务提交时可以使用`ObLsmImpl::batch_put`,来一次性写入一批数据,需要考虑这一批数据写入的原子性,以及写入过程中的失败回滚。

**注意** `update_record_with_trx` 在LAB#3 中不做要求,在 LAB#4 中要求必须实现。

**思考** 当前的 WriteBatch 是完全在内存中的,如果事务中涉及的大小超过内存大小应该如何处理?
Expand All @@ -88,11 +93,11 @@ commit;
#### 背景介绍
在 LAB#1 中,你已经实现了 LSM-Tree 的基本功能,但是你应该发现如果关闭 LSM-Tree 之后重新打开,之前写入的数据可能并不会存在,这是由于 LAB#1 中还没有实现 LSM-Tree 的持久化和恢复机制。在本任务中,你需要实现 LSM-Tree 的持久化和恢复机制,同时基于 LSM-Tree 的 MiniOB 也要支持持久化和恢复。这里介绍下 LSM-Tree 的持久化和恢复机制的实现思路:

1. 通过 Write Ahead Log(WAL)实现 MemTable 数据的持久化。
* 通过 Write Ahead Log(WAL)实现 MemTable 数据的持久化。

WAL 是一种常见的日志机制,用于确保数据的可靠性和持久性。在 LSM-Tree 中,每次数据写入之前,都会先写入 WAL 文件,这是一个文件日志,记录了数据变更的操作细节。即便系统发生故障,数据库可以通过 WAL 文件恢复写入到 MemTable 的数据,从而防止数据丢失。

2. 通过 Manifest 文件实现 SSTable 状态的持久化。
* 通过 Manifest 文件实现 SSTable 状态的持久化。

Manifest 文件是 LSM-Tree 的 "元数据目录",用于记录某一时间点 LSM-Tree 的状态。它描述了 LSM-Tree 中每个 SSTable 文件的元数据(如编号、层级等),使数据库能够在重启或恢复时快速加载恢复 SSTable 的状态。

Expand Down
18 changes: 11 additions & 7 deletions docs/docs/db_course_lab/lab4.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,15 @@ title: LAB#4 性能测试

## 通过 TPC-C 测试所需的前置功能

1. 实现聚合函数(Min/Max/Count/Sum)。支持如下类型的语法:
* 实现聚合函数(Min/Max/Count/Sum)。支持如下类型的语法:
```sql
SELECT min(NO_O_ID) FROM NEW_ORDER WHERE NO_D_ID = %s AND NO_W_ID = %s
```
2. 支持 update/delete 语句。
提示:当前 MiniOB 已基本支持 delete 语句的语法解析/执行,只需要适配 LSM-Tree 存储引擎即可。
提示:update 语句的实现可参考现有的 insert/delete 语句的实现。需要支持如下类型的 update 语法

* 支持 update/delete 语句。

**提示** 当前 MiniOB 已基本支持 delete 语句的语法解析/执行,只需要适配 LSM-Tree 存储引擎即可。
**提示** update 语句的实现可参考现有的 insert/delete 语句的实现。需要支持如下类型的 update 语法

```sql
UPDATE CUSTOMER SET C_BALANCE = C_BALANCE + %s WHERE C_ID = %s AND C_D_ID = %s AND C_W_ID = %s;
Expand All @@ -38,7 +40,7 @@ sudo pip2 install pymysql==0.9.3 --trusted-host pypi.python.org --trusted-host p

## 运行测试

1. 准备 config 文件,例如:
* 准备 config 文件,例如:
```
[miniob]

Expand All @@ -47,12 +49,12 @@ unix_socket = /tmp/miniob.sock

```

2. 启动 MiniOB,例如:
* 启动 MiniOB,例如:
```
./bin/observer -E lsm -t lsm -P mysql -s /tmp/miniob.sock -f ../etc/observer.ini
```

3. 运行 tpcc 测试,例如:
* 运行 tpcc 测试,例如:
```
python ./tpcc.py --config=miniob.config miniob --debug --clients 4
```
Expand All @@ -74,6 +76,7 @@ SELECT W_TAX FROM WAREHOUSE WHERE W_ID = %s;
可参考:https://www.brendangregg.com/FlameGraphs/cpuflamegraphs.html

**提示** 对于存在主键索引的表,表中不能有重复主键的数据。

**注意**:线上测试环境为 1c1g,因此并发测试性能可能与本地环境存在一些出入,线上测试成绩仅供参考,不作为课程成绩的一部分。


Expand Down Expand Up @@ -102,4 +105,5 @@ create table stock (s_i_id int, s_w_id int, s_quantity int, s_dist_01 char(24),
## 参考资料

TPC-C 测试:https://www.tpc.org/tpcc/

TPC-C 测试脚本:https://github.com/nautaa/py-tpcc/tree/miniob
27 changes: 17 additions & 10 deletions docs/docs/db_course_lab/overview.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,39 +45,45 @@ title: 数据库系统实现原理与实践课程实验

如果你已经对 Git/Github 的使用有了一定的了解,可以参考[Github 使用文档](../game/github-introduction.md) 或 [Gitee 使用文档](../game//gitee-instructions.md)来创建自己的 MiniOB 代码仓库(**注意:请创建私有(Private)仓库**)。

#### 准备自己的开发环境
#### 2. 准备自己的开发环境
MiniOB 的开发环境需要使用 Linux/MacOS 操作系统,建议使用 Linux 操作系统。我们为大家准备好了一个[开源学堂在线编程环境](./cloudlab_setup.md)(**建议大家优先使用在线编程环境,避免由于自己开发环境问题导致的bug**),除此之外,我们准备了详细的[本地开发环境准备文档](../dev-env/introduction.md)。

#### 在开发环境中构建调试 MiniOB,并验证 MiniOB 的基本功能
#### 3. 在开发环境中构建调试 MiniOB,并验证 MiniOB 的基本功能
在准备好自己的开发环境后,你就可以下载 MiniOB 代码,编译 MiniOB 并运行测试用例,验证 MiniOB 的基本功能。
1. 下载 MiniOB 代码,**注意:这里请使用自己的私有仓库地址**

* 下载 MiniOB 代码,**注意:这里请使用自己的私有仓库地址**
```
git clone https://github.com/oceanbase/miniob.git
```
2. 在 MiniOB 代码目录下,运行下面命令来编译 MiniOB

* 在 MiniOB 代码目录下,运行下面命令来编译 MiniOB
```
bash build.sh debug
```
3. 进入 build_debug 目录

* 进入 build_debug 目录
```
cd build_debug/
```
4. 在 MiniOB 代码目录下,运行下面命令来启动 MiniOB

* 在 MiniOB 代码目录下,运行下面命令来启动 MiniOB
```
./bin/observer
```
5. 打开另一个终端,进入 build_debug 目录,运行下面命令来启动 MiniOB client

* 打开另一个终端,进入 build_debug 目录,运行下面命令来启动 MiniOB client
```
./bin/obclient
```
6. 在 obclient 中分别执行下面的 SQL 语句,并查看输出结果是否符合预期。

* 在 obclient 中分别执行下面的 SQL 语句,并查看输出结果是否符合预期。
```
create table t1 (id int, name char(10));
insert into t1 values (1, 'hello');
select * from t1;
```

如果一切顺利,你的终端将会展示如下的结果:
* 如果一切顺利,你的终端将会展示如下的结果:
```
$./bin/obclient

Expand All @@ -98,7 +104,8 @@ id | name
miniob >
```

#### 将代码提交到测试平台,并通过 `basic` 题目
#### 4. 将代码提交到测试平台,并通过 `basic` 题目

测试平台中的 `basic` 题目是用来验证 MiniOB 的基本功能的(如创建表,插入数据,查询数据等),原始的 MiniOB 代码(**不需要任何代码修改**)就可以通过测试。你需要参考[文档](https://ask.oceanbase.com/t/topic/35600372)来将 MiniOB 代码提交到测试平台进行测试,并通过 `basic` 题目。至此,恭喜你已经顺利熟悉了开发环境和测试平台的使用。

## 注意事项
Expand Down
0