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

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记录之后再写回。

作者

xiaomaotou31

发布于

2022-04-14

更新于

2022-04-15

许可协议

评论