CMU15-445总结

先随便写几个要点,等整个结束了再详细写。 动手之前先计划,详细周到考虑 多动手,多试错 多读源代码,多练习debug 英语好好学,英语太重要了。

February 22, 2024 · 1 min · Theme PaperMod

Bustub架构简单分析

写在前面 在这篇文章中我们先抛开SQL在bustub的中的历程,直接快进到最后开始执行的阶段,这篇文章只关注设计上的细节。 至于如何理顺这些细节在[[CMU15-445 Project3 - Query Execution]]文章中会有详细的介绍,这里就不再赘述。😃 架构总览 上图中catalog其实不是特别准确,按照我的理解应该是下面这种情况👇。通过一个table_id双向映射表的名字和实体table。 接下来就按照从上到下的顺序依次介绍各个部分的结构。 Catalog 下面这个图是是整个catalog关于table的。👇这里引出了TableInfo. Catalog中不仅仅包含table的信息还储存了index的信息。这里引出了IndexInfo,但是后边用的不是很多。 接下来看TableInfo的组成。(TableInfo的定义就在Catalog.h文件中) TableInfo name_:就是表的名字 table_: 是一个每个节点都是tablepage的双向链表 oid_: 顾名思义就是表的id Schema_:其实到现在我都没有很弄懂这个是干什么的东西,但是chat给出了答案。 什么是Schema 按照我的理解应该是一个类似于表头的包含各种配置信息的一个抽象集合。现在就看看源码。👇 在bustub中schema的信息似乎没有包含很多,就是对每一个列的数据类型约束进行了记录。以及对所有的列进行一个汇总,方便获取到每一个列。 ==Column== 实际上每个列的实现实体是Column,在这个实体中包含列名,数据类型,长度等基本信息。 ⚠️值得注意的是column对于varchar单独做了处理🙂,变长数组终究还是不一样啊。 TableHeap 实质上就是配合TablePage里面的信息构成的双向链表,我觉得这个设计真的非常的巧妙。只用了基本的pre_page_id 和next_page_id这两个变量就把双向链表给建立起来而且耦合度非常的低。 first_page_id_: 就是第一个pageid bufferpool:所有的page都需要从bufferpool中去取。 TablePage的结构 ok看到这里有疑问了? 那么多的信息都存在那里, 这继承的加上初始化的也不够啊。 答案在这里👇 通过偏移量直接在page的剩余空间里去定义各种变量。 ==通过InsertTuple()函数了解详细结构== 直接看源代码: if (tuple.size_ + 32 > BUSTUB_PAGE_SIZE) { // larger than one page size txn->SetState(TransactionState::ABORTED); return false; } auto cur_page = static_cast<TablePage *>(buffer_pool_manager_->FetchPage(first_page_id_)); if (cur_page == nullptr) { txn->SetState(TransactionState::ABORTED); return false; } 这主要是判断一些前置条件的合法性 为什么要用tuple的大小+32进行比较呢? 文末给出答案 在第一页中进行插入,如果没有足够的空间就开一个新页然后插进去 ⚠️需要注意的是,在离开第一页的时候仍然要持有写锁,因为还要写next_page_id变量. 💡跟随代码跳转到TablePage::InserTuple(). ...

February 21, 2024 · 2 min · Theme PaperMod

数据库事务

事务 ==Transaction== 在英文中事务用transaction表示,一般约定俗成的缩写为txn,所以在数据库的源代码中看到txn的话多半就是事务。 ==事务诞生的背景== 我们假设一个银行的场景,转账这一操作在外界看来是单一的操作,但是在数据库内部涉及到很多的操作,假如转账操作发生了失败,那么数据的不一致是不能被接受的。所以这一连串的操作可以被归为逻辑上的一个操作集。要么整体都成功要么都失败。 事务的概念 在chatgpt上问事务的概念他会这样子进行回答。 这也正是事务的关键。 我们回归课本,看课本上给出的定义 事务的隔离性级别 我个人觉得对于隔离性的的理解是非常重要的,在后续的算子的实现当中几乎都要考虑事务的隔离等级,根据不同的隔离等级去进行不同的操作。(我个人现在比较迷茫的是怎么能比较周全的考虑不同隔离等级所带来的影响。:)。看来是时候找个大佬请教一下了。🙃

February 20, 2024 · 1 min · Theme PaperMod

查询的处理和优化

Join Operation, 连表 在查询过程中经常会涉及到连表的操作。那么为什么总是需要连表呢? ==为什么需要连表?== 在存储的时候为了避免数据的冗杂,将表进行规范化,导致表的割裂。 在查询的时候需要获取完整的信息,所以将表进行重新的组装。 连表的算法 Fetching Title#i6kq

February 9, 2024 · 1 min · Theme PaperMod

CMU15-445-Project #3 - Project3 - Query Execution

做这个p3首先需要明晰整个bustub的架构[[Bustub执行器架构简单分析]],在这个文章中进行了很详细的分析。

February 8, 2024 · 1 min · Theme PaperMod