buffer pool manager
- buffer池组成
- frame:缓冲池由frame组成,每次我们需要一个page,就吧这个page替换进frame
- page table:用来记录page到buffer pool的映射关系
- 其他元信息:脏页面(页面是否被修改),引用计数(页面被线程正在访问的计数)
- multiple buffer pools(多个缓冲池,每个池有其策略)
- 减少线程竞争
- 提供多种策略
- 如何实现?根据Object id映射或者哈希
- pre-fetching(预取)
- 提前把一些顺序信息读入buffer pool中
- 可以完成一些操作系统不能完成的预读,如index分支跳转
- scan sharing(扫描共享)
- 查询复用计算结果
- 允许多个查询附加到一个游标上
- buffer pool bypass
- 给查询线程分配一小块内存,查询page的时候不经过缓存池,为了不污染缓存
- 查询量小的时候使用
- O_DIRECT
- 避免操作系统文件缓存
replacement policies
- LRU
- Clock(LRU近似算法)
- LRU-K:为了避免遍历对LRU的影响,K次才不会替换
脏页面
- 页面有一个标识位,记录某次查询是否更改页面记录
- 后台写入(background writing):定时将脏页面写回,避免缓存池中大量脏页面