如果你的企业新开启了一项业务,并为此开发了一套新的应用程序,这需要一个新的数据库为后台。你负责规化此新的数据库。那么,你该如何确定共享池的大小呢?下面的测试可以有助于你确定共享池大小。注意,这样确定的共享池大小,只是估计的大小。到底多大的共享池才适合你的数据库,这需要数据库运行一段时间后,通过观察历史数据才能得知。这就好像你第一次炒菜,你不知道放多少盐,下面的方法只是告诉你大概放多少盐,而具体放多少数量的盐饭菜的才可口,这需要你实验个几次才知道。第一次你放一匙,如果淡了,第二次就放一匙半,等等。数据库的调节也是如此。这就是我们以前尽力讲述历史数据重要性的原因。没有历史数据,没有了可供参考的数据,你就不知道这一次放多少盐才合适。好,下面开始讲述如何测试共享池大小。
首先将你的共享池设置的非常大。如果是在10g下,就将sga_target设置的非常大,重新启动你的数据,然后启动数据库上的所有应用。在应用运行一段时间时间后,通过如下这个语句,可以计算出大概的库缓存的大小:
select mem1+mem2 from (select sum(sharable_mem) mem1 from v$db_object_cache) a,(select value*250 mem2 from v$sysstat where name= 'opened cursors current') b;
这个语句包括两个子查询,第一个子查询是利用v$db_object_cache视图,求得当前库缓存中所有对象所占用的内存总量。另外,Oracle为每个游标还要额外分配250字节的内存用于存储一些管理性信息。第二个子查询就是计算当前打开的游标数量,并用它乘以250,所得结果就是Oracle为游标额外分配的内存总数了。将两个子查询所得结果相加,就是你的应用程序所需的库缓存的大小了。
知道了库缓存的大概大小,我一般的方法是用它剩以2,用的得的结果作为整个共享池的大小。
如果你的应用程序比较散,很难这样为了观察共享池的内存占用情况而全部都集中的运行一下,那么,还有一种更为简单、使用更广的评估共享池、Buffer cache等内存组件大小的方法。对于OLTP系统来说,如果主机上除数据库外不再运行其他软件,我们应该保留20%或30%左右的内存给OS,50%左右的分给SGA,剩下的给PGA。在SGA中,可以将40%分配给Buffer cache,共享池也要占40%,剩下的分给SGA中其他内存组件。如果是OLAP系统,除给OS留20%、30%左右的内存外,SGA和PGA可以一样大,甚至PGA还可以超过SGA。在SGA中,共享池要尽量的小,可以将大部分的内存都分给Buffer cache。
无论你怎么分配,我们这样只是在事先估计一下共享池等内存组件的大小。每个内存组件到底多大合适,等到数据库运行一段时间后,还要参考历史资料再做具体的调整。