buffer cache与相关的latch等待事件 1.buffer cache 2.latch:cache buffers lru chain 3.latch:cache buffers chains 1.buffer cache 我的理解: buffer cache理解成4块结构: 三个列表+1个pool 三个列表指: lru (最近最少使用列表) dirty list (checkpoing qu

buffer cache与相关的latch等待事件

1.buffer cache
2.latch:cache buffers lru chain
3.latch:cache buffers chains

1.buffer cache

我的理解:
buffer cache理解成4块结构: 三个列表+1个pool
三个列表指:
    lru                        (最近最少使用列表)
    dirty list (checkpoing queue)
    hast bucket        (与latch:cache buffer chain相关)

一个pool指:
   buffer pool = db_cache_size / db_block_size

buffer pool:
内存中,数据存放的位置,每个pool的大小就是db_block_size大小.
比如,db_cache_size=800M,db_cache_size=8192,那么,buffer cache中包含的buffer pool 就有102400个(800*1024*1024/8192).

lru:
最近最少使用列表,一个顺序的清单,最上面为:MRU端(最常使用的对象),最下面为:LRU端(最不常用的对象)
在数据库初使化时,所有的buffer都被hash到LRU列表上管理;
当要从数据文件中读取数据时,首先要在LRU列表上查找free buffer,找到后才读取到buffer pool(即buffer cache)中.

dirty list:
脏数据列表,指向内存中需要写入数据文件的buffer pool的地址

hash bucket:
对于buffer pool,如果都通过一种结构管理,像从前面102400个pool中如果要找一个pool的话,性能会很低下.为了提高效率,oracle引入了 bucket结构,oracle将所有的buffer通过hash算法将buffer存放到不同的bucket上,用户需要定位buffer时,只用到 bucket中查找少量的buffer就可以找到.这样就提高了效率.

buffer cache的原理:
这个原理至关重要.

当一个Server进程需要读取数据到buffer cache中时:

1).首先要判断该数据是否存在于buffer中,如果存在,且可用.则获取数据,再根据LRU算法在LRU列表上移动该block;

2).如果数据不存在于buffer中,Server进程就要扫描lru列表,查找可用的buffer空间(free buffer)以放数据到buffer中,
在扫描lru list的过程中,如果碰到已经被修改过的buffer,就将它移动到dirty list(checkpoint queue)上(由于增量检查点的引入,DBWR进程也会主动扫描一定比例的LRU list,将发现的脏数据块移动到dirty lis);
如果dirty list(checkpoint queue)达到了阈值,Server进程就会通知DBWn进程写出脏数据到数据文件(DBWR进程写的一个触发条件);
如果Server进程扫描lru列表到一个阈值还没有找到足够的free buffer,这时,就停止对lru的扫描转而通知DBWR写出脏数据,释放内存空间;这时,进程处于free buffer wait等待.

3).找到足够的buffer之后,Server进程就可以将数据从数据文件读入到buffer cache中;

4).如果读取的block不满足"一致性"需求,则Server进程就需要通过当前block的版本从回滚段中读取该block的"一致性"镜像返回给用户(consistent gets).

2.latch:cache buffers lru chain

当用户读取数据到buffer cache中,或buffer cache根据LRU算法进行管理时,就不可避免的要扫描LRU列表以获取free buffer或更改buffer状态.
buffer cache为众多并发进程提供并发访问,所以在搜索的过程中,必须获取latch锁定内存结构,以防止并发访问对内存中的数据造成损坏.
这个用于锁定LRU的latch就是cache buffers lru chain.

cache buffers lru chain锁存器的默认数量:
DB_WRITER_PROCESSES <= 4        锁存器数= 4 * cpu数
DB_WRITER_PROCESSES > 4        锁存器数= db_writer_processes * cpu数
可以通过初始化参数_db_block_lru_latches来向上调整cache buffers lru chain锁存器的数量(不建议这么做,除非在oracle support的建议下)

如果这个latch竞争激烈:
(1) 适当增大buffer cache,这样可以减少读数据到buffer cache,减少扫描lru列表的次数

(2) 适当增加lru latch数量,修改_db_block_lru_latches参数.不建议这么做.

(3) 使用多缓冲池技术

3.latch:cache buffers chains

引起cache buffers chains争用的原因一:低效率的SQL语句

多个并发低效的SQL语句同时执行,都设法获得相同的数据集,就造成cache buffers chains的争用.
    调整高buffer_gets的SQL语句可以缓解这类问题.(较小的逻辑读意味着较少的latch get操作,从而减少锁存器争用并改善性能。)

引起cache buffers chains争用的原因二:热点块(最常见原因)
    判断是不是热块问题的常用方法检查latch free事件的p1raw参数值,如果p1raw是相同的锁存器地址,则表明是热块问题.

select sid,event,p1raw,p2,p3,seconds_in_wait,wait_time,state
    from v$session_wait
    where event = 'latch free';

如果要确定具体的热点块,就要查询v$latch_children,x$bh,dba_extents,根据子latch的信息确认热点块.
    v$latch_children.addr 与x$bh.hladdr相关联,可以确认子latch相关的块.
    再根据x$bh.dbarfil与dba_extents.relative_fno和x$bh.dbablk与dba_extents.block_id&&block_id+blocks关联,查到具体对象.

1> 查看cache buffers chains子latch情况:

SQL> select * from
(select addr,child#,gets,misses,sleeps,immediate_gets igets,immediate_misses imisses,spin_gets
         from v$latch_children
        where name = 'cache buffers chains'
order by sleeps desc
)
where rownum<11;

ADDR         CHILD#       GETS     MISSES     SLEEPS      IGETS    IMISSES SPIN_GETS
-------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
69B625BC        739    1056438         65         41        645          0         46
69A821BC          3    1115506         54         39        711          0         34
69B0A9BC        451    1476125         96         30        573          0         83
69A83EFC          9     207227        833         20        800          0        823
69AA573C        119     167852        635         14        592          0        628
69AB2DBC        163     860553         22         14        670          0         15
69B8C19C        876    1283643       1125         12        224          0       1118
69B03E7C        429     315851         53         11        413          0         47
69B1C47C        509     590733         18         11        689          0         14
69BADEBC        987     223777        208         11        529          0        201

2> 联合x$bh视图查出相关块信息

SQL> select b.addr,a.tch,a.ts#,a.dbarfil,a.dbablk,b.gets,b.misses,b.sleeps
from
      (select *from
              (select addr,ts#,file#,dbarfil,dbablk,tch,hladdr from x$bh order by tch desc)
       where rownum<11
      ) a,
      (select addr,gets,misses,sleeps from v$latch_children where name = 'cache buffers chains'
      ) b
where a.hladdr = b.addr;

ADDR            TCH        TS#    DBARFIL     DBABLK       GETS     MISSES     SLEEPS
-------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
69BB451C      17729          6          5    1277992     548061          0          0
69B92CDC      17729          6          5    1277991     581254          0          0
69B7149C      17729          6          5    1277990     534335          0          0
69B4FC5C      17729          6          5    1277989     534914          0          0
69B2E41C      17728          6          5    1277988    1087533          1          0
69B0CBDC      17726          6          5    1277987     538605          0          0

3> 联合dba_extents查出具体的数据对象

select distinct owner,segment_name,segment_type
from dba_extents a,
     (select * from (select addr,tch,ts#,file#,dbarfil,dbablk from x$bh order by tch desc)
       where rownum<11
     ) b
where a.relative_fno = b.dbarfil
and   a.block_id <= b.dbablk
and   a.block_id + blocks > b.dbablk;

4> 联合v$sqltext或v$sqlarea找出相关的SQL语句

select /*+ rule */ hash_value,sql_text
from v$sqltext
where (hash_value,address) in
      (select a.hash_value,a.address
         from v$sqltext a,
              (select distinct a.owner,a.segment_name,a.segment_type
                 from dba_extents a,
                      (select dbarfil,dbablk
                         from (select dbarfil,dbablk
                                 from x$bh
                               order by tch desc
                              )
                        where rownum<11
                      ) b
                where a.relative_fno = b.dbarfil
                  and a.block_id <= b.dbablk
                  and a.block_id + a.blocks > b.dbablk
               ) b
        where a.sql_text like '%'||b.segment_name||'%'
          and b.segment_type = 'TABLE'
       )
order by hash_value,address,piece;

Oracle buffer cache与相关的latch等待事件的更多相关文章

  1. Oracle buffer cache

    Buffer Cache buffer cache 结构图 HASH链 ORACLE使用HASH算法,把buffer cache中每个buffer的buffer header串联起来,组成多条hash ...

  2. oracle buffer cache的基本原理

    Buffer cache 的原理 一. 1·)当一个服务器进程需要读数据到buffer cache中时,首先必须判断该数据在buffer 中是否存在,如果存在且可用,则获取该数据,根据lru算法在lr ...

  3. Oracle Tuning 基础概述01 - Oracle 常见等待事件

    对Oracle数据库整体性能的优化,首先要关注的是在有性能问题时数据库排名前几位等待事件是哪些.Oracle等待事件众多,随着版本的升级,数量还在不断增加,可以通过v$event_name查到当前数据 ...

  4. oracle等待事件以及解决方案

    我们可以通过视图v$session_wait来查看系统当前的等待事件,以及与等待事件相对应的资源的相关信息,从而可确定出产生瓶颈的类型及其对象. v$session_wait的p1.p2.p3告诉我们 ...

  5. Oracle中常见的33个等待事件小结

    在Oracle 10g中的等待事件有872个,11g中等待事件1116个. 我们可以通过v$event_name 视图来查看等待事件的相关信息     一. 等待事件的相关知识 1.1 等待事件主要可 ...

  6. ORACLE 常见等待事件

    一. 等待事件的相关知识 1.1 等待事件主要可以分为两类,即空闲(IDLE)等待事件和非空闲(NON-IDLE)等待事件.1). 空闲等待事件指ORACLE正等待某种工作,在诊断和优化数据库的时候, ...

  7. 全面解析Oracle等待事件的分类、发现及优化

    一.等待事件由来 大家可能有些奇怪,为什么说等待事件,先谈到了指标体系.其实,正是因为指标体系的发展,才导致等待事件的引入.总结一下,Oracle的指标体系,大致经历了下面三个阶段: · 以命中率为主 ...

  8. Oracle等待事件之等待事件详解

    一. 等待事件的相关知识:1.1 等待事件主要可以分为两类:即空闲(IDLE)等待事件和非空闲(NON-IDLE)等待事件.1). 空闲等待事件指ORACLE正等待某种工作,在诊断和优化数据库的时候, ...

  9. 【Oracle】等待事件详细内容

    一.等待事件的相关知识 1.1 等待事件主要可以分为两类,即空闲(IDLE)等待事件和非空闲(NON-IDLE)等待事件.1). 空闲等待事件指ORACLE正等待某种工作,在诊断和优化数据库的时候,不 ...

随机推荐

  1. 传说中的WCF(9):流与文件传输

    在使用Socket/TCP来传输文件,弄起来不仅会有些复杂,而且较经典的“粘包”问题有时候会让人火冒七丈.如果你不喜欢用Socket来传文件,不妨试试WCF,WCF的流模式传输还是相当强大和相当实用的 ...

  2. linux系统下挂载windows共享目录

    在工作中有时我们需要在linux上挂载windows共享目录.首先我们需要学会在linux上查看windows共享了那些目录.查看操作需要安装samba-client. [root@ ~]# yum ...

  3. linux c first

    创建文件夹mkdir 文件夹名称删除文件夹rm -rf 文件夹名称创建文件touch test.c删除文件rm -f test.c编译gcc -o test test.c在执行只语句后会生成一个*te ...

  4. jq的bind用法

    type,[data],function(eventObject)String,Object,Function type: 含有一个或多个事件类型的字符串,由空格分隔多个事件.比如"clic ...

  5. MyBatis笔记——Mapper动态代理

    前提概要 Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法. Mappe ...

  6. MAC的一些实用

    重置Dock, Launchpad defaults write com.apple.dock ResetLaunchPad -bool true; killall Dock;

  7. 感知机(python实现)

    感知机(perceptron)是二分类的线性分类模型,输入为实例的特征向量,输出为实例的类别(取+1和-1).感知机对应于输入空间中将实例划分为两类的分离超平面.感知机旨在求出该超平面,为求得超平面导 ...

  8. java post 请求

    新公司的分词为post调用方式,以前还没用过post,这次上网查了下,比较简单,但还是写篇博客记录下,代码为网上找的,非原创. package com.chuntent.tool; import ja ...

  9. USACO Section 2.4: Bessie Come Home

    因为题目给了边的信息,所以比较适用bell-man的方法 /* ID: yingzho1 LANG: C++ TASK: comehome */ #include <iostream> # ...

  10. (译) Angular运行原理揭秘 Part 1

    当你用AngularJS写的应用越多, 你会越发的觉得它相当神奇. 之前我用AngularJS实现了相当多酷炫的效果, 所以我决定去看看它的源码, 我想这样也许我能知道它的原理. 下面是我从源码中找到 ...