存储结构模型
在红线之上的是volatile storage(易失存储),其需要电力支持,当断电的时候会失去存储的内容。
红线之下的是none-volatile storage(非易失存储),及时断点也不会失去存储内容,因而也可被称为持久化存储。
volatile storage的寻址方式较none-volatile storage更简单,none-volatile storage需要块地址加上字节偏移来确定一个地址。
none-volatile的获取代价较为昂贵。
中间还插了一嘴,某种None-volatile Memory兼具二者的优势,在快速访问的同时也可以持久化存储。
接下来是各个设备的Access Time的比较。
访问内容的一个简单示例
- 执行引擎向Memory发出查询请求
- Memory从Disk中加载Directory(目录)
- Memory从Direcotry中查询page2,并将page2加载进来
- Memory向执行引擎返回page的指针
为什么不适用OS的内存管理机制
- OS发生内存映射错误时耗费大量时间和资源
- OS不清楚数据库应用打算做什么,仅仅将一切是为一连串的读写请求
结论:不要使用M-map,让db处理自己的事情最好。
存储处理器(Storage Manager)
Storage Manager负责维护DB文件,有些甚至会预测页表的时空位置
其使用页的形式来管理文件(跟踪页的读写信息,记录空闲页)
页:一组空间固定的数据块
- 常常包含行记录,元数据,索引,日志信息
- 大部分系统不会混淆页的类型
- 有些系统要求页自包含(自包含:就是页所需要的描述数据全部包含在页本身中,不需要读取其他页的内容来获取)
- 每个页需要一个id标识(DBMS通过一个非直接方式映射页和id)
页大小
Hardware Page(一般4KB)
OS Page(一般4KB)
DB Page(512B-16KB)
链表式结构
链表发存储两个链表,一个是空闲页的链表,另一个则是非空闲页的链表。
目录法
维护一个特殊的Directory映射页的信息
例如Directory包含被映射页的空余空间大小
页的结构信息
页头
- 页的大小
- 校验和
- DBMS版本
- Transaction Visibility(事物可见性?)
- 附加信息
存储结构
劣势:无法确认具体删除了那一块Tuple(即无法确认Tuple的具体位置)。
使用插槽映射tuple数据,插槽映射了tuple数据的页偏移,这样我们就可以相对随意的移动tuple的位置,因为tuple的偏移量已经存储在slot中,可以通过slot轻松获取这一信息。
slot从头部生长,tuple数据从尾部生长,当slot与tuple间无法再存储数据时,我们成为页满了。(这个好像跟Jvm的部分内存分配策略有异曲同工之妙)