ITPub博客

首页 > Linux操作系统 > Linux操作系统 > oracle 成长历程-第三章:内存组件详解-buffer cache-概述及相关术语-1

oracle 成长历程-第三章:内存组件详解-buffer cache-概述及相关术语-1

原创 Linux操作系统 作者:qwj801207 时间:2009-11-17 19:09:14 0 删除 编辑

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博客 ” ,链接:https://blog.itpub.net/347643/viewspace-619857/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-11-16

  • 博文量
    23
  • 访问量
    21637