在用户请求数据时,Oracle从磁盘读取数据(称为Oracle块)并将数据存放到缓冲区高速缓存中,以便在需要时访问。随着对这些数据需求的减少,最终Oracle将从缓冲区高速缓存中删除这些数据,为新的数据腾出空间。请注意,有的操作不使用缓冲区髙速缓存(SGA),而是直接读入PGA区。直接排序操作和并行读取就属于这种情况。
1.设置缓冲区高速缓存尺寸
与管理共享池组件一样,管理缓冲区高速缓存最好的办法是选择自动SGA管理。但如果选择手动管理SGA,可通过反复试验来设置缓冲区高速缓存的尺寸。先给池分配一个内存量,观察缓冲区高速缓存的命中率,看应用从内存检索到数据的频率有多高,与它从硬盘读取数据相对比。计算缓冲区命中率的术语有时比较混乱。以下是需要了解的一些术语。
物理读:Oracle从磁盘读数据块。从磁盘读数据比从内存读数据成本高。如果发布一个査询,Oracle总是首先在内存(数据库缓冲区高速缓存)中检索数据。
DB块获取:这是一种缓冲区高速缓存读取,以当前(current)方式检索一个块。这种情况通常发生在Oracle更新至块的最近版本时进行的数据修改中。因此,如果Oracle发现被请求的数据在数据库缓冲区高速缓存中,它将检查块中的数据是否最新。如果用户更改了缓冲区高速缓存中的数据,但尚未提交这些更改,相同数据的新请求不能显示这些临时更改。如果缓冲区块中的数据是最新的,则每个这样的数据块检索被视为一个DB块获取(DB block get)。
一致性获取:这是一种缓冲区高速缓存读取,以一致性方式检索一个数据块。这可能包括为维护一致性准则而进行的撤销段的读取。如果Oracle发现自本次读开始以来,另一个会话已经更新了该块中的数据,则Oracle应用撤销段中的新信息。
逻辑读取:每当Oracle通过从数据库缓冲区高速缓存中读取数据能满足数据请求时,就是一个逻辑读取。因此,逻辑读取包括DB块获取和一致性获取。
缓冲区获取:这个术语指检索到的数据库高速缓存缓冲区的数目。这个值与前述的逻辑读取相同。
下面的公式给出缓冲区髙速缓存命中率:
1 - ('physical reads cache') / ('consistent gets from cache' + 'db block gets from cache')
可使用下面的查询得出3个必要的缓冲区高速缓存统计数据的当前值:
select name, value
FROM v$sysstat
where name IN ('physical reads cache',
'consistent gets from cache',
'db block gets from cache');
下面的计算以前面代码中从V$SYSSTAT视图中推导出的统计数据为基础,显示我的数据库的缓 冲区高速缓存命中率比91%稍多一点。
1- (505726180)/(103264732 + 5924585494) = .916101734
从缓冲区高速缓存命中率的这个公式可以看到,物理读取与总逻辑读取的比例越低,缓冲区高速缓存命中率越高。
可使用v$buffer_pool_statistics视图(它列岀实例的所有缓冲池)推导出缓冲区高速缓存的命中率:
select name,
physical_reads,
db_block_gets,
consistent_gets,
1 - (physical_reads / (db_block_gets + consistent_gets)) "hitratio"
from v$buffer_pool_statistics;
此外,可使用Database Control的Memory Advisor得到最佳缓冲区高速缓存尺寸的建议。此建议以图形方式给出,说明增加SGA和减少DB时间之间的折中。可使用V$DB_CACHE_ADVICE视图(使用 V$SGA_TARGET_ADVICE设置SGA_TARGET尺寸)来了解需要增加多少亙冲区高気缓存以适当降低物理I/O。
实际上,V$DB_CACHE_ADV1CE视图的输岀说明在减少物理读取量(估计值)还有意义时,可以増加多少缓冲区髙速缓存内存。Memory Advisor模拟不同尺寸的缓冲区高速缓存的未命中率。在此意义上,Memory Advisor可阻止你为降低系统的物理读取量而过分地浪费内存。
一个大表的全表扫描中使用的Oracle块老化退出缓冲区高速缓存的速度比来自较小的表的全扫描或索引访问的Oracle块的老化退出速度快。Oracle可能会决定只保留较大表的一部分在缓冲区高速缓存中,以避免刷新它的輕个缓冲区高速缓存。因此,如果使用几个较大表的全表扫描,缓冲区高速缓存命中率将会人为降低。
如果应用由于某种原因要进行许多全表扫描,则増加缓冲区高速缓存的尺寸并不会提高性能。某些DBA追求较高的高速缓存命中率(如99%左右)。但较高缓冲区高速缓存命中率并不能保证应用的响应时间和吞吐量也较高。如果存在大量的全表扫描,或者数据库是一个数据仓库而不是OLTP系统,则缓冲区高速缓存命中率可能会远远低于100%,但这并不一定是件坏事。
如果数据库应用由低效的SQL组成,则逻辑读取数目会很高,缓冲区高速缓存命中率显得很高(如99.99%),但这并不表示数据库执行得很有效。请参阅Cary Millsap的一篇标题为"Why a 99%+Database Buffer Cache Hit Ratio Is Not Ok"的有趣文章(http://www.hotsos.com/e-library/abstract.php?id=6)。
2.对缓冲区高速缓存使用多个池
不一定将所有缓冲区高速缓存内存分配给单个池。正如第10章所述,可以使用3个独立的池:保留缓冲池(keep buffer pool)、回收缓冲池(recycle buffer pool)、默认缓冲池(default buffer pool)。虽然不一定要使用保留缓冲池和默认缓冲池,但应选择配置3种池以便能其根据访问方式指派对象。通常,在使用多缓冲池时应遵循以下经验規则:
对不常访问的较大对象使用回收高速缓存。我们不希望这些对象不必要地占用默认池中大量的空间。
对希望一直位于内存中的较小对象使用保留高速缓存。
Oracle对未指派到回收高速缓存或保留高速缓存的所有对象自动使用默认池。
自8.1版本以来,Oracle使用一个名为接触计数(touch count)的概念来度量一个对象在缓冲区高速缓存中被访问的次数。使用接触计数管理缓冲区高速缓存的算法与Oracle用来管理高速缓存的传统的修正LRU算法有所不同。每访问一次缓冲区,接触计数増1。较低的接触计数表示块不经常重用,会浪费数据库缓冲区高速缓存空间。
如果有较大的对象,其接触计数较低但占用相当比例的缓冲区高速缓存,可考虑将它们放入回收池。代码清单20-5包含一个査询,它说明如何发现具有较低的接触计数的对象。用户SYS拥有的x$bh表的TCH列给出了接触计数。
确定放入回收缓冲池的备选对象
select
obj object,
count(1) buffers,
(count(l)/totsize) * 100 percent_cache
from x$bh,
(select value totsize
from v$parameter
where name ='db_block_buffers')
where tch=1
or (tch = 0 and lru_flag <10)
group by obj, totsize
having (count(l)/totsize) * 100 > 5;
代码清单2Q5中的査询显示3个对象,每个对象的接触计数都较低,但占据约20%的缓冲区高速缓存。显然,它们是回收缓冲池很好的备选对象。实际上,限制了来自这3个表的不常使用的块可在缓冲区高速缓存中用光缓冲区的空间。
下面对DBA_OBJECTS视图的査询给出这些对象的名称:
SELECT object_name FROM DBA OBJECTS WHERE object_id IN (1386,1412,613114);
这时可以指派这3个对象到预定的缓冲区高速缓存池。可使用类似的准则来确定哪些对象应该作为保留池的成分。假如希望将占用至少25个缓冲区且平均接触计数大于5的所有对象钉在保留池中.代码清单20-6给出以用户SYS身份执行的査询。
确定保留缓冲区高速缓存的备选
select obj object,
count(l) buffers,
avg(tch) average_touch_count
from x$bh
where lru_flag = 8
group by obj
having avg(tch) > 5
and count(1) > 25;
这里举一个简单的例子,说明如何指派对象给特定的缓冲区高速缓存(保留池和回收池)。首先,使用下面的初始化参数设置在数据库中配置保留池和回收池:
DB_CACHE_SIZE=256MB
DB_KEEP_CACHE_SIZE=16MB
DB_RECYCLE_CACHE_SIZE=16MB
在此例子中,保留和回收髙速缓存都是16MB。创建了保留池和回收池后,就可方便地给它们指派对象.所有原来在默认缓冲区高速缓存中的表,除在对象创建语句中另外指定,都自动高速缓存在默认缓冲区高速缓存中。
使用alter table语句指派表或索引到一个特定类型的缓冲区高速缓存。例如,可指派下面的两个表到保留和回收缓冲区高速缓存:
alter table test1 storage (buffer_pool keep);
alter table test2 storage (buffer_pool recycle);
注解 关于Oracle的接触计数缓冲区管理的详细介绍,请使用URL:http://resources.orapub.com/product_p/tc.htm, 下载Craig A. Shallahamer的文章All About Oracle's Touch-Count Data Block Buffer Algorithm.
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




