CMU-15-445笔记(三)
Buffer Pool Organization
Buffer Pool在内存中是以一个固定大小数组的形式来呈现的,数组中每个元素都有固定的大小,称为frame
当DBMS需要一个page的时候,DBMS可以让硬盘中的page转存到Buffer Pool中来
Page Table
Page Table建立起 page id 到 frame id的映射,是一个哈希表
同时page table也会设立起标志位,表明当前page的状态
- Dirty Flag
- Pin/Reference Counter
- 主要用来避免Buffer Pool替换掉对应的page,因为此刻可能多个线程在共同访问这个页
当page不在page table中的时候,DBMS会申请一个latch,给对应的entry上锁,然后从disk读取相关的page到buffer pool,然后释放latch
- 主要用来避免Buffer Pool替换掉对应的page,因为此刻可能多个线程在共同访问这个页
Locks && Latches
Locks
锁在数据库中是一个高层次概念的东西,例如查询的时候会上锁,此刻锁是一种概念,例如next-key lock
锁的主要作用有
- 保护事务
- 在事务期间持有
Latches
Latches是一个低级的原语,类似OS中的锁
- 用来保护数据库中的临界区
- 只在数据库进行操作的时候持有
Memory Management
Multiple Buffer Pools
数据库中可以有多个Buffer Pool,每个Buffer Pool都可以有不同的缓冲策略,这样的好处一个是可以优化特定种类的查询,另一个是减少latch的使用,提高并发。实现
Object Id
将record id和他们对应的page id,slotnum存在一起,从而让只当的record id始终映射到特定的buffer pool中
Hashing
直接hash record id,然后去查找对应的buffer pool,然后映射
Pre-Fetching
Pre fetching可以当Buffer Pool获取一个page的时候,其他相关联(在磁盘中连续的,或者是page id连续的)的page也预缓存到Buffer Pool中
Scan Sharing
当多个线程查询有重叠的时候,例如A先查询,B发现A的查询可以被自己使用的时候,就会共用A的,等A扫描完后,再去扫描剩余自己需要的数据。
Buffer Pool Bypass
连续的扫描操作不会存到buffer pool,防止buffer pool溢出(来回交换page
OS Page Cache
大多数数据库不会让OS页缓存数据,所以可以直接使用O_DIRECT来告诉操作系统不要缓存
Buffer Pepacement Policies
LRU
替换最久未使用的页
Clock
clock是LRU的替换策略,因为LRU开销略大,clock是给每个页设置个reference bit,当page被访问的时候 reference bit设置为1,当要移除page的时候,从上一个访问的位置开始,轮询访问每个page的reference bit,如果bit为1,则重置为0,若为0,则移除page
LRU和Clock的问题
这俩的一个问题是sequential flooding
- 当查询是连续的查询的时候,会读取每个页
- 这样就会污染buffer pool,又可能新读取的page再也不会读取第二次
LRU-K
记录最后K次的访问时间戳,然后计算每次访问的时间间隔,从而DBMS可以知道下一次哪个页最可能被访问
Localization
DBMS针对每个查询都做出pages的限制,使得对buffer pool的影响降低到最小
Priority Hints
DBMS获取每个页的在查询过程中的上下文,从而得知一个页是否重要
Dirty Pages
如果一个页时脏的(被修改过),那么DBMS必须将页的内容写回硬盘中,所以移除Dirty Page开销相对来说是较大的。
Background Writing
DBMS可以周期性的将脏页写回硬盘中,写回需要在log记录之后再写回。
CMU-15-445笔记(三)