MiniOB 1
MiniOB is one mini database, helping developers to learn how database works.
载入中...
搜索中...
未找到
RecordManager

这里负责管理在一个文件上表记录(行)的组织/管理 更多...

class  HeapRecordScanner
 遍历某个文件中所有记录 更多...
 
struct  PageHeader
 数据文件,按照页面来组织,每一页都存放一些记录/数据行 更多...
 
class  RecordPageIterator
 遍历一个页面中每条记录的iterator 更多...
 
class  RecordPageHandler
 负责处理一个页面中各种操作,比如插入记录、删除记录或者查找记录 更多...
 
class  RowRecordPageHandler
 负责处理行存页面中各种操作 更多...
 
class  PaxRecordPageHandler
 负责处理 PAX 存储格式的页面中各种操作 更多...
 
class  RecordFileHandler
 管理整个文件中记录的增删改查 更多...
 
class  ChunkFileScanner
 遍历某个文件中所有记录,每次返回一个 Chunk 更多...
 
class  RecordScanner
 遍历某个表中所有记录 更多...
 

详细描述

这里负责管理在一个文件上表记录(行)的组织/管理

表记录管理的内容包括如何在文件上存放、读取、检索。也就是记录的增删改查。 这里的文件都会被拆分成页面,每个页面都有一样的大小。更详细的信息可以参考BufferPool。 按照BufferPool的设计,第一个页面用来存放BufferPool本身的元数据,比如当前文件有多少页面、已经分配了多少页面、 每个页面的分配状态等。所以第一个页面对RecordManager来说没有作用。RecordManager 本身没有再单独拿一个页面 来存放元数据,每一个页面都存放了一个页面头信息,也就是每个页面都有 RecordManager 的元数据信息,可以参考 PageHeader,这虽然有点浪费但是做起来简单。

对单个页面来说,最开始是一个页头,然后接着就是一行行记录(会对齐)。 如何标识一个记录,或者定位一个记录? 使用RID,即record identifier。使用 page num 表示所在的页面,slot num 表示当前在页面中的位置。因为这里的 记录都是定长的,所以根据slot num 可以直接计算出记录的起始位置。 问题1:那么如果记录不是定长的,还能使用 slot num 吗? 问题2:如何更有效地存放不定长数据呢? 问题3:如果一个页面不能存放一个记录,那么怎么组织记录存放效果更好呢?

按照上面的描述,这里提供了几个类,分别是: