+++++buffer cache 深度解析(14)


4)reads:从硬盘里读取的数据块的数量 。注意,这个数量大于实际从硬盘里读取的数量,因为这部分block也包括了从操作系统缓存里读取的数据块数量 。
5)reads :有些数据块不会先从硬盘读入内存再从内存读入PGA再传给用户,而是绕过SGA直接从硬盘读入PGA 。比如并行查询以及从临时表空间读取数据 。这部分数据块由于不缓存使得hit ratio不会被提高 。
6)reads(lob):与 reads 一样 。
7) free:这个值表示为了找到可用数据块而跳过的数据块的数量 。这些被跳过的数据块就是脏的或被锁定的数据块 。明显,这个值如果持续增长或很高,就需要增加 cache的大小了 。
在获得了这些统计信息以后,我们可以计算 cache的命中率:
1Hit Ratio = 1 – (physical reads – physical reads direct- physical reads direct (lob) ) / session logical reads2Miss ratio = (physical reads – physical reads direct-physical reads direct (lob) ) / session logical reads
通常在OLTP下,hit ratio应该高于0.9 。否则如果低于0.9则需要增加 cache的大小 。在考虑
调整 cache hit ratio时,需要注意以下几点 。
1) 如果上次增加 cache的大小以后,没有对提高hit ratio产生很大效果的话,不要盲目增加 cache的大小以提高性能 。因为对于排序操作或并行读,是绕过 cache进行的 。
2) 在调整 cache时,尽量避免增加很多的内存而只是提高少量hit ratio的情况出现 。
我们还可以查询每种 cache的统计信息,主要关注的还是和以及
的值 。
SQL> SELECT name, block_size,physical_reads, db_block_gets,consistent_gets2FROM v$buffer_pool_statistics;NAMEBLOCK_SIZE PHYSICAL_READS DB_BLOCK_GETS CONSISTENT_GETS-------------------- ---------- -------------- ------------- ---------------DEFAULT81922897871977591DEFAULT1638428011
v$中名称以DBWR开头的都是有关DBWR后台进程相关的统计信息 。当DBWR进程写完脏数据块以后或者扫描完LRU链表以后更新这些统计信息 。DBWR会基于被触发的频率以及所处理的内存数据块的数量与总内存数据块的数量的比例,来进行自我调整 。我们可以通过这些统计信息得到一些对当前DBWR运行情况的认识 。
4.3cache的等待事件
与 cache相关的等待事件包括:latch free、 busy waits、freewaits 。曾经发生过的等
待事件可以从v$(一个等待事件对应一行记录)和v$(一个一个等待事件对应一行记录)中看到 。而当前系统正在经历的等待事件可以从v$看到 。
4.3.1 latch free等待
等待事件“latch free”中与 cache有关的有两类:cachelatch和cachelru chain latch 。在理解了上面所描述的有关 cache的内部管理机制以后,就应该很容易理解这两个latch产生的原因 。
对于 cache中的每个hash chain链表来说,都会有一个名为cachelatch的latch来保护对hash chain的并发操作,这种latch通常也叫作hash latch或CBC latch 。
数据库中会有很多的cachelatch,每个latch都叫做child cachelatch 。一个child cachelatch会管理多个hash chain 。前面我们知道,hash chain的数量由一个隐藏参数:ts决定 。同样也有一个隐藏参数:es来决定有多少个cachelatch来管理这些hash chain 。该参数的缺省值由 cache中所含有的内存数据块的多少决定,当内存数据块的数量
?少于2052个时,es = power(2,trunc(log(2, 内存块数量 - 4) - 1))
?多于个时,es = power(2,trunc(log(2,- 4) - 6))
?位于2052与 之间,es = 1024
可以使用下面的SQL语句来确定当前系统的cachelatch的数量 。
SQL> select count(distinct(hladdr)) from x$bh;COUNT(DISTINCT(HLADDR))-----------------------1024SQL> select count(*) from v$latch_children where name='cache buffers chains';COUNT(*)----------1024