BUFFER CACHE(转自tjpanda88)

来源:互联网 发布:遗传算法有什么用 编辑:程序博客网 时间:2024/05/16 09:13

buffer cache是SGA的一部分,所有的用户都能共享里面的信息。当一个server process访问数据的时候,首先是在buffer cache中查找,如果数据在buffer中存在,我们还需要根据data buffer的状态,来判断是否进行DB Block Gets还是Consistent Gets,如果数据在buffer中不存在,则我们需要在buffer cache中寻找足够的空间来加载我们所需要的数据,如果在buffer cache中我们找不到足够的空间,那么我们就需要触发DBWn进程,去写出脏数据,用来释放我们的buffer空间。
  Oracle通过几个list来对buffer进行管理。其中最为突出的就是LRU List还有Checkpoint queue,这些list上面存放的就是具体指向buffer的指针。
  LRU List主要就是用来维护内存中的buffer,当数据库初始化的时候,所有的buffer都放入LRU List上进行管理。当我们从数据文件中读取数据的时候我们现在要在LRU List上面寻找free的buffer,然后将数据读取到我们所找到的这个free buffer中。只要数据被修改了,那么这个buffer的状态就变为了dirty,那么Oracle就会把这个buffer从LRU List移到Checkpoint Queue中去。在Checkpoint Queue上的buffer都是一些候选的稍后会被DBWn写出到数据文件的buffer,那么这里还有一点需要注意的是:一个buffer要么存在于LRU List上面,要么存在于Checkpoint Queue上面,不可能同时存在于两个List上面。
  我们可以通过编辑参数DB_CACHE_SIZE和对buffer Cache进行配置。DB_CACHE_SIZE初始化参数取代了DB_BLOCK_BUFFERS 初始化参数,DB_BLOCK_BUFFERS使用于早期的版本中。DB_CACHE_SIZE 参数以字节单位指定标准块大小的缓冲区高速缓存的大小。
  为了兼容早期版本的数据库, DB_BLOCK_BUFFERS 参数仍然可以使用,但是它保留一个静态的参数,并且不能与其他动态大小调整的参数组合使用DB_nK_CACHE_SIZE 初始化参数
  非标准块的缓冲区块大小和数量由如下的初始化参数指定:
    DB_2K_CACHE_SIZE
    DB_4K_CACHE_SIZE
    DB_8K_CACHE_SIZE
    DB_16K_CACHE_SIZE
    DB_32K_CACHE_SIZE
  每个参数给相应的块大小指定缓冲区高速缓存的大小。
  例如:
    DB_BLOCK_SIZE=4096
    DB_CACHE_SIZE=12M
    DB_2K_CACHE_SIZE=8M
    DB_8K_CACHE_SIZE=4M
  在这个例子中,指定标准数据库块大小的参数值是4K。标准块大小的缓冲区高速缓存的大小为12M。另外,2K和8K的高速缓存大小分别配置为8M和4M。

注意:
  不能使用DB_nK_CACHE_SIZE参数来调整标准块的大小。例如,如果DB_BLOCK_SIZE设置为2K,设置DB_2K_CACHE_SIZE。等于2K是无效的。标准缓存的块大小总是由DB_CACHE_SIZE决定的。


  在Buffer Cache中的buffer有四种状态:
  Pinned: The block is either currently being read into the cache or being written to。 Other sessions wait to access the block。(当前正在更新的内存数据块。)
  Clean: The buffer is now unpinned and is a candidate for immediate aging out if the current contents (data block) are not referenced again。 Either the contents are in sync with disk or the buffer contains a CR snapshot of a block。(buffer的内容与数据文件中的一致。)
  Free/unused: The buffer is empty because the instance just started。 This state is very similar to the clean state, except that the buffer has not been used。(buffer cache中的内存数据块为空。)
  Dirty: The buffer is no longer pinned but the contents (data block) have changed and must be flushed to disk by DBWn before it can be aged out。(buffer cache中的内存数据块的内容被修改,从而导致与数据文件中的数据块的内容不一致。)

 

名词解释:
1、DB Block Gets(当前请求的块数目)
  当前模式块意思就是在操作中正好提取的块数目,而不是在一致性读的情况下而产生的块数。正常的情况下,一个查询提取的块是在查询开始的那个时间点上存在的数据块,当前块是在这个时刻存在的数据块,而不是在这个时间点之前或者之后的数据块数目。
2、Consistent Gets(数据请求总数在回滚段Buffer中的数据一致性读所需要的数据块)
  这里的概念是在处理你这个操作的时候需要在一致性读状态上处理多少个块,这些块产生的主要原因是因为由于在你查询的过程中,由于其他会话对数据块进行操 作,而对所要查询的块有了修改,但是由于我们的查询是在这些修改之前调用的,所以需要对回滚段中的数据块的前映像进行查询,以保证数据的一致性。这样就产 生了一致性读。
3、Physical Reads(物理读)
  就是从磁盘上读取数据块的数量,其产生的主要原因是:
  1、 在数据库高速缓存中不存在这些块
  2、 全表扫描
  3、 磁盘排序

  它们三者之间的关系大致可概括为:
  逻辑读指的是Oracle从内存读到的数据块数量。一般来说是'consistent gets' + 'db block gets'。当在内存中找不到所需的数据块的话就需要从磁盘中获取,于是就产生了'phsical reads'。

 

0 0