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. 对MySQL DELETE语法的详细解析

    以下的文章主要描述的是MySQL DELETE语法的详细解析,首先我们是从单表语法与多表语法的示例开始的,假如你对MySQL DELETE语法的相关内容十分感兴趣的话,你就可以浏览以下的文章对其有个更 ...

  2. Google Protocol Buffers简介

    什么是 protocol buffers ? Protocol buffers 是一种灵活.高效的序列化结构数据的自动机制--想想XML,但是它更小,更快,更简单.你只需要把你需要怎样结构化你的数据定 ...

  3. JS面向(基于)对象编程--构造方法(函数)

    构造函数(方法)介绍 什么是构造函数呢?在回答这个问题之前,我们来看一个需求:前面我们在创建人类的对象时,是先把一个对象创建好后,再给他的年龄和姓名属性赋值,如果现在我要求,在创建人类的对象时,就直接 ...

  4. android模拟器(genymotion)+appium+python 框架执行过程中问题解答

    1.case运行过程中中文输入不进去? 答:注意事项 1)需要修改系统编码为utf-8,才能解决中文输入问题,case执行入口文件添加代码如下: import sys reload(sys) sys. ...

  5. mq_send

    NAME mq_send - 将消息发送到消息队列 (REALTIME) SYNOPSIS #include <mqueue.h>int mq_send(mqd_t mqdes, cons ...

  6. 【重走Android之路】【Java面向对象基础(一)】数据类型与运算符

    [重走Android之路][基础篇(一)][Java面向对象基础]数据类型与运算符   1.数据类型介绍 在Java中,数据类型分为两种:基本数据类型和引用类型. 基本数据类型共8种,见下表: 基本数 ...

  7. Linux任务前后台的切换

    Shell支持作用控制,有以下命令实现前后台切换: 1. command& 让进程在后台运行 2. jobs 查看后台运行的进程 3. fg %n 让后台运行的进程n到前台来 4. bg %n ...

  8. 在eclipse中调试web项目的时候如何把web项目分配给配置好的服务器

    举个例子,我今天在做spring和struts2整合的例子 新建项目blk 1.配置好web.xml,struts.xml,applicationContext.xml,写好jsp页面 2.把stru ...

  9. 共有19款Java 文件上传组件开源软件

    http://www.oschina.net/project/tag/139/fileupload?lang=19&sort=view

  10. jdbc框架 commons-dbutils+google guice+servlet 实现一个例子

    最近闲着无聊,于是看了一下jdbc框架 commons-dbutils与注入google guice. 我就简单的封装了一下代码,效率还是可以的.... jdbc+google guice+servl ...