首页 cmu 15-445

buffer pools 缓冲池

两个作用,一个是缓存用户的数据,另一个是缓存用户的更新

空间的控制,把经常在一起使用的数据放在同一个位置使用

时间的控制,什么时候读写内存,还要减少用户的等待时间

disk-oriented DBMS内存比硬盘要小的多

研究的三个问题:

  • buffer pool manager
  • replacement policies 内存的替换策略
  • other memory pools

frame

locks or latches

  • locks就是锁,逻辑上的锁
  • latches具体的,底层的锁,也叫mutes

page table or pabe directory

  • table是索引内存池中的页
  • directory是索引磁盘中的页

global policies全局策略

local policies本地策略

DBMS是有很多缓冲池的

例如:

  • 多个缓冲池实例
  • 每一个数据库用缓冲池
  • 每一个page用一个缓冲池

多个缓冲池可以降低锁的冲突

多个缓冲池的使用方式

  • 方式1:Object Id

记住数据去了那个缓冲池,

  • 方式2:hashing

去hash

  • pre-fetching,提前判断要什么,直接给
  • scan sharing 如果两个在同时读取一组数据,那就一起操作,但是如果有操作限制就有可能出错
  • bypass 如果要扫描一大片数据的话,就不让这个进内存池了,因为这个东西是很少会需要的
  • os page cache一般要绕过操作系统的缓存,因为是冗余的

替换策略:

两个问题,替换什么,怎么替换

least-recently used LRU最近最少使用:

clock,这是一个模糊的LRU,就转圈,如果一圈之后都没有用的话就换了他

LRU对遍历整个数据库是很费的,在有些工作的情况下,刚进来的那个页其实是最没用的页

LRU-K , LRU是记时间,LRU-K记好多次访问时间,寻找规律,找到应该释放的那一页

localization本地化,按照每一条语句去驱逐,把单独自己使用的驱逐,别人使用的不驱逐

priority hints给进缓冲池的每个页一个优先级,按照优先级驱逐

dirty pages我改了页,但是没有存储,这就会产生一个脏页(数据库和内存中是不一样的),所以当脏页产生的时候,不能清理内存池中的这一页,应该先写回内存,而后再清理,如果你感觉这一页以后用不到就直接写回硬盘,当然如果经常用到就不写回内存,一直使用

background writing隔一段时间,就集中的进行刷脏

当然缓冲池中不一定只有数据库内容,可以将热点内容存住,日志,




文章评论