3 内存组件详解-BUFFER CACHE
Server processes 把数据文件读进buffer cache。为提高性能,一次读有时候读多个块。DBWn 进程写数据从buffer cache写进数据文件。为提高性能,DBWn一次写多个块。
某一时间,buffer cache可能容纳一个块的多个拷贝。一个已存在的块的拷贝,但是对于满足server process 可能需要构建读一致拷贝从以前的镜像信息。
为了能够加快处理数据的速度,oracle必须将读取过的数据缓存在内存里。而oracle对这些缓存在内存里的数据起了个名字:数据高速缓存区(db buffer cache),通常就叫做buffer cache。按照oracle官方的说法,buffer cache就是一块含有许多数据块的内存区域,而这些数据块主要都是数据文件里的数据块内容的拷贝。通过初始化参数:buffer_cache_size来指定buffer cache的大小。oracle实例一旦启动,该区域大小就被分配好了。
buffer cache所能提供的功能主要包括:
1) 通过缓存数据块,从而减少I/O。
2) 通过构造CR块,从而提供读一致性功能。
3) 通过提供各种lock、latch机制,从而提供多个进程并发访问同一个数据块的功能。
3.1 Buffer Cache术语
1、 Multiple Buffer Pools-Buffer pool 有三种类型:
n Default:默认的池
n Recycle:大对象池,当数据库读取某一大对象时候,可能导致其它对象的buffer老化,所以可以把大对象的读取指定到recycle池中,避免影响其它对象。这个池里默认为CR块。
n Keep:和recycle相反,把常用对象的buffer长久keep在池中。 通过DB_KEEP_CACHE_SIZE(BUFFER_POOL_KEEP)参数可以指定大小。
n SQL> create table test (n number) storage (buffer_pool keep);
SQL> alter table test storage (buffer_pool recycle);
n 公式:Buffers in default pool = Total number of buffers – (Buffers in recycle pool + Buffers in keep pool)
n 可以通过V$SEGSTAT_NAME, V$SEGSTAT, 和 V$SEGMENT_STATISTICS这个三个视图进行段级别的监控。
n Keep pool 、Recycle pool和default pool采用的LRU算法是不同的,目前大多数资料所讲的LRU算法及关于buffer cache的话题,主要针对的是default pool。有些描述中的buffer cache即是指的 buffer cache中的 default pool,本书中同样如此。关于keep pool 和recycle pool 的算法资料较少。
2、 hash算法则是为了能够进行快速查找定位所使用一种技术。所谓hash算法,就是根据要查找的值,对该值进行一定的hash算法后得出该值所在的索引号,然后进入到该值应该存在的一列数值列表(可以理解为一个二维数组)里,通过该索引号去找它应该属于哪一个列表。然后再进入所确定的列表里,对其中所含有的值,进行一个一个的比较,从而找到该值。这样就避免了对整个数值列表进行扫描才能找到该值,这种全扫描的方式显然要比hash查找方式低效很多。其中,每个索引号对应的数值列在oracle里都叫做一个hash bucket。
3、 如磁盘上数据文件的最小IO单元叫block一样,buffer cache的最小单元(或者说结构)叫buffer,每个buffer跟x$bh中每条记录有一一对应关系。
4、 data buffer header list的结构是用哈希桶Hash buckets来构建的,它按照分组。注意,block class和block type不同。
5、 Hash chain是在每一个Hash bucket内部,维护多个data buffer header的数据结构。
6、 Buffer descriptor存在于PGA,它实际属于client。它存储的消息是client提供的。
7、 Buffer Header
n 描述缓冲区的buffer
n 在TSN, RDBA 做hash算法,为hash buckets获取一个固定的数字
n 被上层组件做为一种提示使用
8、 Buffers能够被请求为NULL, NEW, CR, CRX, SHR, 和 EXL 模式。
9、 链表是一种数据结构,通过将对象串连在一起,从而构成链表结构。这样,如果要修改、删除、查找某个对象的话,都可以先到链表中去查找,而不必实际的访问物理介质。
10、buffer cache有两种LRU链表:
n LRUW:LRU Write list((checkpoint queue),);写链表,也就是dirty list,维护着当前的脏块。写链表是需要写入数据文件的脏数据块列表。
n LRU:LRU List最近最少使用的链表。LRU链表是控制不包含任何数据的空闲空间(free buffers)、正在使用的空间(pinned buffers)和还没有写到写链表的脏数据块。
n 一个buffer只能被其中一个list cache。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/347643/viewspace-619857/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/347643/viewspace-619857/