buffer cache实验5-latch:cache buffers chain

1.CBC latch产生的原理:

一次逻辑读时CBC latch锁及Buffer pin锁的获取和释放过程如下:

1.加Latch X

2.进入hash chain,在相应的BH上加Buffer pin S (0-->1)

3.释放Latch X

4.进行逻辑读--也就是通过BH中的buffer adderss找到数据块在内存中真实位置  ---假如读了1MS

5.加Latch X

6.释放Buffer pin S (1-->0)  0:没锁  1:共享锁  2:独占锁

7.释放Latch X

物理读时需要将数据块的buffer header挂载到hash chain上,也需要获取CBC LATCH,buffer header中有hash chain的信息,BH挂载到hash chain上,应该在BH内存结构中会有信息更改,BH的修改也就需要有Buffer pin了,锁的获取和释放应该和逻辑读时差不多,不过是在Buffer pin S 上要加2号独占锁。当然这一点是我大胆推测的哈哈。

CBC latch上一般都用的独占锁,使用共享锁的情况是:9I后在索引的根、枝叶读时使用共享CBC LATCH,无BUFFER PIN方式访问上

BH上Buffer pin锁状态:

0 未加锁

1 共享锁,读BUFFER BLOCK  ---SELECT

2 独占锁,写BUFFER BLOCK   ---DML语句

2.从CBC latch产生的原理可以发现,出现CBC LATCH争用会有以下情况:

1.CBC latch保护不同的链表、不同BH   :同一CBC LATCH下多个hash chain上的多个BH被同时访问时,

2.CBC latch保护同一链表下同一BH  :同一hash chain上同一BH被同时访问时

3.物理读将数据块挂载到hash chain上时,多个物理块HASH冲突都挂载到同一个hash chain或者要挂载的hash chain上的BH在被逻辑读

这里的被访问,可能发生在逻辑读或者物理读,即:使用到CBC latch的场景是:

服务器进程需要扫描hash chain上数据块--逻辑读

服务器进程需要将数据块挂载到hash chain上--物理读

关于hash chain与hash bucket,详见本系列第一篇:点击打开链接

3.关于CBC LATCH争用的模拟实验,有两种思路:

一是热链--这个不太好模拟,我也没做成功。

二是热块-这个好模拟,同时还会有buffer busy waits,具体实验见:http://blog.csdn.net/haibusuanyun/article/details/17252767

本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/database/storage/

4.latch: cache buffers chains 解决思路:

1、热链:调整_db_block_hash_latches加大latch数量,作用是减少同一LATCH下多个桶被同时访问的情况。即多个表的相应块在BUFFER CACHE中对应不同BH,不同BH又对应在不同HASH BUCKETS,但是这多个HASH BUCKETS是属于同一个LATCH。。

alter system set "_db_block_hash_latches"=10240 scope=spfile;    

2、热块:调整BUFFER _CACHE,参数:db_cache_size,big integer 100M

热块是:同一表在BUFFER CACHE中的块(一个块对应一个BH,BH对应一个HASH BUCKET)被多个会话同时读,--全表扫描时容易出现。可以使用多个会话同时读取同一表的同一行的方式来模拟产生CBC latch,查询时使用ROWID做条件,查询速度快,更容易引起CBC latch。

3、修改应用,减少全表扫描,也就是优化SQL语句了

例如:CBC Latch的产生次数的查询:

SYS@ bys3>col name for a20

SYS@ bys3>select NAME,GETS ,MISSES ,SLEEPS ,IMMEDIATE_GETS, IMMEDIATE_MISSES from v$latch where name like '%cache buffers chains%';

NAME                       GETS     MISSES     SLEEPS IMMEDIATE_GETS IMMEDIATE_MISSES

-------------------- ---------- ---------- ---------- -------------- ----------------

cache buffers chains    2006932          0          0          78095                0

时间: 2024-07-30 05:29:49

buffer cache实验5-latch:cache buffers chain的相关文章

buffer cache实验6:latch:cache buffers lru chains

1.working set与Latch:cache buffers lru chain: 每个working set都具有它自己的一组LRU和LRUW链表(LRU和LRUW链表总是成对出现的). ORACLE为了提高buffer cache性能(大内存),使用了多个working set 每个working set都由一个名为"Latch:cache buffers lru chain"的latch来保护,每一个lru latch对应一个working set. 而每个被加载到buff

【转载】latch: cache buffers chains

       当一个数据块读入sga区,相应的buffer header会被放置到hash列表上,我们称其这hash chains,chain在中文的意为链条或串的意思,表达就是关连性.如果一个进程想访问或修改hash chain上的block,它首先要获得"cache buffers chains" latch.   原因一:低效率的SQL语句(主要体现在逻辑读过高) cache buffers chains latch很大程度与逻辑读有关,所以要观注v$sql中BUFFER_GET

深入理解latch: cache buffers chains

事件背景:   一个客户的数据库发生了宕机事件,查看了数据库的awr报告,原来是由于出现大量的latch: cache buffers chains等待事件导致系统消耗量大量的CPU,最终导致系统hang住: 说明:   要理解latch: cache buffers chains并解决这个问题,就需要深入的了解Buffer Cache及其原理.1.Buffer Cache概述:   Buffer Cache是SGA的一部分,Oracle利用Buffer Cache来管理data block,B

ORACLE等待事件latch: cache buffers chains

    今天上午,电渠生产库维护人员通知,ORACLE生产库中有比较多的latch: cache buffers chains引起的会话,造成堵塞,相关处理过程如下    环境:hp-unix    数据库版本:10.2.0.5    登录数据库查询等待事件:      根据等待事件latch: cache buffers chains查询相关的SQL_ID,引起争用的对象所在的文件号和块号 select * from (select      count(*),      sql_id,   

缓解latch: cache buffers chains的案例

这两天我们的一个核心系统U*S,正在做压力测试,虽然压测的服务器配置不如生产,但可以反映出一些问题,初始测试的TPS可以说非常低,据测试同事反映,压测一会,数据库服务器CPU就上来了,业务上有积报现象,找不着原因. 既然数据库服务器CPU飙升上来了,说明数据库服务器上有压力,这就需要看压测期间,数据库有何负载变化.Oracle提供了我们非常丰富的工具,AWR就是其中之一,可以让我们了解特定时间段,数据库相关负载信息,具体使用方法可以参考<一个执行计划异常变更的案例 - 外传之AWR>. 测试数

[20150121]关于latch cache buffers chains

[20150121]关于latch cache buffers chains事件.txt --最近一直在看,关于latch: cache buffers chains的等待事件. --造成这个事件的主要原因有2个:一个是热链,另外一个是热块.我喜欢通过例子来说明,实际上书上写的更加详细. --这里主要测试热块造成的情况. 1.建立测试环境: SCOTT@test> @ver1 PORT_STRING                    VERSION        BANNER -------

USE HttpRuntime.Cache OVER HttpContext.Current.Cache

缓存是在ASP.NET开发中经常需要用到在技术,在使用过程中,通常会用到HttpRuntime.Cache和 HttpContext.Current.Cache.而且在使用过程中,通常会觉得这两个似乎用哪一个都行,都能达到缓存 数据的目的.那么这两个Cache到底有什么不同呢?在什么时候用哪一个比较好呢?这里谈谈我的一些了 解和看法吧. 两者的异同 先来看看msdn的解释 HttpContext.Cache : Gets the ASP.NET Cache object for the curr

Java Cache系列之Guava Cache实现详解

Guava作为Google开源出来的工具库,Google自己对Guava的描述:The Guava project contains several of Google's core libraries that we rely on in our Java-based projects: collections, caching, primitives support, concurrency libraries, common annotations, string processing,

Java Cache系列之Cache概述和Simple Cache

前记:最近公司在做的项目完全基于Cache(Gemfire)构建了一个类数据库的系统,自己做的一个小项目里用过Guava的Cache,以前做过的项目中使用过EHCache,既然和Cache那么有缘,那就趁这个机会好好研究一下Java中的Cache库.在Java社区中已经提供了很多Cache库实现,具体可以参考http://www.open-open.com/13.htm,这里只关注自己用到的几个Cache库而且这几个库都比较具有代表性:Guava中提供的Cache是基于单JVM的简单实现:EHC