ADB-Buffer Pool
Buffer Pool
Conception
Buffer vs. Disk file
- 一般而言,frame 大小 = page 大小
- buffer 由若干 frame 组成,file 由若干 page 组成
Lock vs. Latch
- Lock 为概念上的锁,Latch 更具体,比如锁和锁眼
Page Table vs. Page Directory
- Page Table 是 page id 到 buffer pool frames 的 map
- Page Directory 是 page id 到 page locations 的 map
DBMS Buffer vs. OS Buffer
- DBMS 经常能预测访问模式,可以使用更专门的缓冲区替换策略。且 DBMS 需要强制写回磁盘的能力。
- OS 不能保证写顺序
Buffer Pool Optimizations
Multiple Buffer Pools
- 每个数据库一个缓冲池
- 每个页类型一个缓冲池,如存储索引的页,存储元素的页
Pre-Fetching
- 全表扫描时提前读取
Scan Sharing
- 两个请求共享结果
Buffer Pool Bypass
- 数据不进内存池,连续读一大片且不需要再用的数据
Buffer Replacement Policies
OPT算法
称为 Belady’s 算法,最佳的页面置换算法
每次置换以后永远用不到的页面,如果没有则淘汰最久以后再用到的页面
只存在理论意义,可以作为算法性能上界作为对比
LRU
- 所有 frame 按照最近一次访问时间排列成一个链表,基于时间局部性,越是最近访问的在未来被访问的概率越高
- 优点:在重复访问同一个页面上效果较好,选择frame的复杂度只有 O(1)
- 缺点:缓存污染、维护 LRU 链表代价高、不满足时间局部性则性能差、没有考虑访问频率
LRU-K
- 若某个 frame 的访问次数达到了K次以上,则尽量不置换
- 维护两个 LRU 链表(1个是访问K次以上的,1个访问次数小于K),优先置换小于 K 次的链表。
2Q
- 与 LRU-2 类似,区别在于访问1次的队列采用FIFO
Second-Chance FIFO
- 给每个 frame 两次置换机会
- 所有 frame 组成 FIFO 链表,每个 frame 附加一个 bit 位,初始为 0。当 FO 页第一次被选中置换时置为 1,并移到 FI 端。只有 bit 位为 1 的 FO 端的页才被选中置换
CLOCK
避免每次访问都需要调整链表
引入环形Second Chance FIFO,引入一个current指针指向当前指向的frame,给每个frame添加一个referenced位,初始为1
- current 指向 frame 的 pin-count>0,则 current++
- current 指向 frame 的 referenced 位若为 1,则置 0,current++
- current 指向 frame 的 referenced 位若为 0,且 pin-count 为 0,则替换该 frame,current++
若访问命中时,不会改变current指针
Priority Hints
给优先级提示,比如某个根节点