Large Pool是一种类似共享池的SGA缓冲池,和共享池不同的是,只有少量类型的对象可以再Large Pool中创建。Large Pool的空间不在共享池中分配,是在数据库启动的时候另外分配的。Large Pool的大小由LARGE_POOL_SIZE确定。Oracle数据库也可以不配置Large Pool。
从Oracle 8开始,Oracle数据库引入了Large Pool,在Oracle 8中,Large Pool的主要功能由两个:
l 为MTS(共享服务器的早期版本)模式的会话分配UGA空间
l 作为连续文件IO的缓冲,比如系统管理的恢复和rman备份恢复(当RMAN使用了多个IO SLAVES的时候)
从Oracle 8i开始,Large Pool增加了一个功能,就是为并行执行的操作提供缓冲区。当PARALLEL_AUTOMATIC_TUNING设置为TRUE的时候,并行操作会在Large Pool中分配缓冲区空间。 ORACLE 9i中,Large Pool还被用来存储Oracle XA的相关信息。
Large Pool也使用shared pool闩锁,和共享池不同,Large Pool不使用LRU机制,因此Large Pool中的缓冲区不会被换出,用户会话来控制分配和释放Large Pool的空间。如果Large Pool空间不足,会出现ORA-4031错误。
当系统中配置了Large Pool,那么共享服务器连接(MTS)只会在Large Pool中分配UGA空间,如果没有每只Large Pool,那么共享服务器连接会在共享池中分配空间。当一个新的会话连接上来的时候,首先会在共享池中分配一个比较小的空间(称为固定UGA空间,FIXED UGA),其他的动态UGA空间全部会在Large Pool中分配。如果Large Pool空间不足,会出现类似的错误:
ORA-04031: unable to allocate 636 bytes of shared memory
("large pool","EMPSCOTT","session heap","define var info")
在Large Pool中,空间是分段申请的,每段空间的最小值由LARGE_POOL_MIN
_ALLOC参数确定(该参数的取值范围为16k,缺省为16k)。
Large Pool的大小由参数LARGE_POOL_SIZE确定。定义Large Pool的语法为:
LARGE_POOL_SIZE = integer [K | M]
如果没有配置,ORACLE的缺省值为0。LARGE_POOL_SIZE的取值范围是大于600K,最大值和操作系统的内存有关。
在一般情况下LARGE POOL使用需求不大,因此不必要设置过大的LARGE POOL。