毕设做 OLAP,新开一个分支 query,有两个子分支,负责人分别是 lrk 和 rsy
- query-codegen
- query-execution
新开一个 branch 叫做 presentation-opt,用于交付学校的暑期实验项目。
基于 branch presentation 做了一些工作:
- issue#11 BUG: doUpdate cnt error , fixed in
1718dad
- issue#9 BUG: WAL, replay undo log on FREE page will cause overwrite error, fixed in
d7adeb9
Team Project for Software Engineering course
为了软件工程课程的项目展示,新开一个branch叫做 presentation,其中 sql 不支持 subquery。主要原因是我现在没有想清楚,对于复杂查询,表名和列名如何变化,以及这之间的映射应该谁来维护。
_xjbDB_MSVC_
:/src/include/env.h,主要是一些基础类型_xjbDB_RELEASE_
:/main.cpp,程序入口SIMPLE_TEST
:/src/page.cpp,页锁,用于并发B+树,定以后表示单线程B+树_xjbDB_test_STORAGE_ENGINE_
:/test/test_storage_engine.cpp_xjbDB_test_BPLUSTREE_
:/test/test_Bplustree.cpp,测试B+树,和std::map
对拍_xjbDB_test_VM_
:/test/test_vm.cpp,用来发布_xjbDB_TEST_QUERY_
:/test/test_query.cpp,测试 sql 解析成 query plan
使用 VS 的话,预定义 _xjbDB_MSVC_
,_xjbDB_RELEASE_
,_xjbDB_test_VM_
就行,可选定义 SIMPLE_TEST
(反正事务不是并发的)
使用 GCC 或者 Clang 的话,就在 /src/include/env.h 中定义相应基础类型,然后预定义 _xjbDB_GCC_
或者 _xjbDB_Clang_
就行。
/src/include/debug_log.h 中的一些bool常量:用于开启 log 输出,对于 debug 或者 想了解并大脑跟进执行流程 非常有用
- 长度限制(参考设计文档)
- FROM 之后最多跟2个表
- FROM a
- FROM a, b
- FROM a JOIN b
- UPDATE 不能 SET PK
- 没有 Query Optimization
基础服务很重要,前期存储引擎里面的基础服务抽象的挺不错。比如:
- page 层对 k-v 的服务
- B+树迭代器
- VirtualTable 作为一个 channel
写 query process 的时候有点赶,基本是上来就写,基础服务做的很不好。
在抽象基础服务之前,需要在大脑中过一遍整个执行流程的细节,最好是把每个模块之间的交互都要模拟一遍,这样才知道怎么提供一套infra。写存储引擎之前,我大概把 《SQLite Database System Design and Implementation》 翻了一遍,并且把一些重要细节理清了,才动手开始写,在写B+树之前就已经想好了page层需要提供什么服务了。
query process 的基础服务做的很烂,主要有几点:
- 逻辑列(
std::string
)到物理列(DB::page::range_t
)的映射,这个我在用的地方才现场翻译,,实在太糟糕了 - FK 的处理,这个我没看一般DB是怎么写的,,自己胡写,做了一个 pk view 在内存里,然后每次修改都手动维护
- 关于 NULL 的支持,我现在的想法是在每个物理列之前用1B来标记,,但是基础服务抽象的太差了,,很多物理列都是当场用的时候手写,所以现在很难加了
- query process 的基础服务
- WHERE 中可以把 PK 的判断单独提出来,这样就可以用到B+树上的pk查询范围
- 能否设计一个协议,让 query plan 使用物理列
- 数据库历史统计信息(由于 query 树是流式处理,所以join的时候不知道输入表的行数,只能随机等一个)
我写到VM才发现没法做并发控制,因为不知道怎么上行锁,所以B+树的并发操作看起来也没用了。。另外我看 sqlite 的VM是执行 query compilation 之后的生成代码的,但是我们这边没人懂 code gen,所以还是对 operator tree 做解释执行,算是个假的虚拟机吧,唯一一个不错的点就是在 Volcano 上做了一个 channel。VM之后的基础服务没想好就开始写了,导致把一些实现细节耦合在整体逻辑里了。
这次debug做得还不错,基本把整个流程全部输出出来人肉跟踪了一遍,印象里B+树好像也没什么bug,一开始还被 sqlite 骗了。