`

如何配置多个Buffer Pools

 
阅读更多
来自tom

在Oracle 的较早版本中,只有一个块缓冲区缓存,所有段的所有块都放在这个区中。从Oracle 8.0开始,可以把SGA中各个段的已缓存块放在3个位置上。


默认池(default pool):所有段块一般都在这个池中缓存。这就是原先的缓冲区池(原来也只有一个缓冲区池)。
保持池(keep pool):按惯例,访问相当频繁的段会放在这个候选的缓冲区池中,如果把这些段放在默认缓冲区池中,尽管会频繁访问,但仍有可能因为其他段需要空间而老化(aging)。用于想无限制(pin)的缓冲区,可以对那些需要经常访问并驻留在内存的小表使用keep pool。

回收池(recycle pool):按惯例,访问很随机的大段(偶尔访问的大段)可以放在这个候选的缓冲区池中,这些块会导致过量的缓冲区刷新输出,而且不会带来任何好处,因为等你想要再用这个块时,它可能已经老化退出了缓存。要把这些段与默认池和保持池中的段分开,这样就不会导致默认池和保持池中的块老化而退出缓存。


需要注意,在保持池和回收池的描述中,我用了一个说法“按惯例”。因为你完全有可能不按上面描述的方式使用保持池或回收池,这是无法保证的。实际上,这3个池会以大体相同的方式管理块。将块老化或缓存的算法并没有根本的差异。这样做的目标是让DBA 能把段聚集到“热”区(hot)、“温”区(warm)和“不适合缓存”区(do not care to cache)。


理论上讲,默认池中的对象应该足够热(也就是说,用得足够多),可以保证一直呆在缓存中。缓存会把它们一直留在内存中,因为它们是非常热门的块。可能还有一些段相当热门,但是并不太热。这些块就作为温块。这些段的块可以从缓存刷新输出,为不常用的一些块(“不适合缓存”块)腾出空间。为了保持这些温段的块得到缓存,可以采取下面的某种做法:
将这些段分配到保持池,力图让温块在缓冲区缓存中停留得更久。
将“不适合缓存”段分配到回收池,让回收池相当小,以便块能快速地进入缓存和离开缓存(减少管理的开销)。


任何一种做法都会增加DBA所要执行的管理工作,因为要考虑3个缓存,要确定它们的大小,还要为这些缓存分配对象。还要记住,这些池之间没有共享,所以,如果保持池有大量未用的空间,即使默认池或回收池空间不够用了,保持池也不会把未用空间交出来。总之,这些池一般被视为一种非常精细的低级调优设备,只有所有其他调优手段大多用过之后才应考虑使用。

--将表使用keep pool,但是要确保db_keep_cache_size能够容得下要放入keep pool的所有对象。
--alter table table_name storage(buffer_pool keep);之后对表进行分析,确认表已被缓存到keep pool中。

--当keep pool中无法容纳时,会使用默认缓存区内存空间(默认缓存区有多余的空间)。

--当对象增长时,keep pool的内存空间也许会不再适合该对象。


测试:


keep pool相关资料:
http://yangtingkun.itpub.net/post/468/77951
http://yangtingkun.itpub.net/post/468/78272
http://yangtingkun.itpub.net/post/468/86429
http://space.itpub.net/4227/viewspace-68852


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics