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


1) off:不收集数据 。
2) on:开始分配内存收集数据,有可能引发CPU和内存的负担,可能引起4031错 。
3) ready:不收集数据,但是收集数据的内存已经预先分配好了 。通过把该参数值从off设置为ready,然后再设置为on,就可以避免出现4031错 。
会根据当前所监控到的物理读的速率,从而估算出在不同大小尺寸的 cache下,所产生的可能的物理读的数量 。会将这些收集到的信息放入视图:v$中 。每种类型的 cache都会有相应的若干条记录来表示所建议的 cache的大小 。比如下面,我们显示对于缺省类型的、缺省数据块尺寸的 cache的建议大小应该是多少 。
SQL> SELECT size_for_estimate, buffers_for_estimate,2estd_physical_read_factor,estd_physical_reads3FROM v$db_cache_advice4WHERE NAME = 'DEFAULT'5AND block_size = (SELECT VALUE6FROM v$parameter7WHERE NAME = 'db_block_size')8/SIZE_FOR_ESTIMATE BUFFERS_FOR_ESTIMATE ESTD_PHYSICAL_READ_FACTOR ESTD_PHYSICAL_READS----------------- -------------------- ------------------------- -------------------45001.386940154810001.3848400931215001.1861343391620001.1397329962025001289522430001289522835001289523240001289523645000.8671251044050000.8671251044455000.8671251044860000.7422214885265000.7422214885670000.7422214886075000.554160406480000.554160406885000.554160407290000.554160407695000.5541604080100000.55416040
这里的字段actor表示在相应的 cache尺寸(由字段表示)
下,估计从硬盘里读取数据的次数除以在内存里读取数据的次数 。如果没有发生物理读则该比值为空 。在
内存足够的前提下,这个比值应该是越低越好的 。从上面的输出中,我们可以看到,如果将 cache
设置为60M,可以获得较好的性能,物理读也将会有一个显著的下降 。但是设置为大于60M的话(比如
64M或68M),则不会降低物理读,反而浪费内存空间 。所以从上面的查询结果中,我们可以知道,设置
为60M是比较合适的 。
4.2cache的统计信息
为了对 cache进行性能的诊断,提供了很多有关 cache的统计信息 。这些统计信息大致可以分成三类:
1)有关用户发出的对内存数据块的请求相关的统计信息;
2)有关DBWR后台进程对内存数据块处理相关的统计信息;
3)RAC相关的统计信息 。
我们在诊断 cache时,不需要关注所有的统计信息 。这里主要介绍几个重要的统计信息,其他的统计信息都可以到《:C》中找到 。如下所示:
SQL> SELECT name, value FROM v$sysstatWHERE name in (2'session logical reads',3'physical reads',4'physical reads direct',5'physical reads direct (lob) ',6'consistent gets',7'db block gets',8'free buffer inspected')9/NAMEVALUE---------------------------------------------------------------- ----------session logical reads73797db block gets498consistent gets73299physical reads29017free buffer inspected0physical reads direct40
这里做些简单的解释 。
1)reads:所有的逻辑读的数据块的数量 。注意,其中包括先从硬盘上读数据块到内存里,再从内存里读数据块 。
2)gets:在一致性( read)读模式下读取的内存里的数据块数量 。包括从 里读取的数据块数量以及从data block 里读取的数据块数量 。主要是通过产生的 。/也能产生很少量的此类数据块 。注意:如果的运行时间过长,由于的bug导致 gets大大超过实际的数量 。因此建议使用‘no work -read gets’, ‘ only -read gets’,‘ only -read gets’, ‘ and-read gets’之和来代替 gets的值 。
3) db block gets:在当前()模式下读取的内存里的数据块的数量 。不是读取过去某个时点的数据块,而必须是当前最新的数据块 。主要是通过//来产生的,因为DML需要当前最新的数据块才能对之进行改变 。在字典管理表空间下,一些获得当前可用扩展空间的语句也会产生此类数据块,因为必须得到当前最新的空间使用信息才能扩展 。逻辑上,reads =gets + db block gets 。