large pool

导读:

  )并不是因为它是一个“大”结构才这样取名(不过,它可能确实很大)。之所以称之为大池,是因为它用于大块内存的分配,共享池不会处理这么大的内存块。

  在Oracle 8.0引入大池之前,所有内存分配都在共享池中进行。如果你使用的特性要利用“大块的”内存分配(如共享服务器UGA内存分配),倘若都在共享池中分配就不太好。另外,与共享池管理内存的方式相比,处理(需要大量内存分配)会以不同的方式使用内存,所以这个问题变得更加复杂。共享池根据LRU来管理内存,这对于缓存和重用数据很合适。不过,大块内存分配则是得到一块内存后加以使用,然后就到此为止,没有必要缓存这个内存。

  Oracle需要的应该是像为块缓冲区缓存实现的回收和保持缓冲区池之类的组件。这正是现在的大池和共享池。大池就是一个回收型的内存空间,共享池则更像是保持缓冲区池。如果对象可能会被频繁地使用,就将其缓存起来。大池中分配的内存在堆上管理,这与C语言通过malloc()和free()管理内存很相似。一旦“释放”了一块内存,它就能由其他进程使用。在共享池中,实际上没有释放内存块的概念。你只是分配内存,然后使用,再停止使用而已。过一段时间,如果需要重用那个内存,Oracle会让你的内存块老化。如果只使用共享池,问题在于:一种大小不一定全局适用。

  大池专门用于以下情况:

  q 共享服务器连接,用于在SGA中分配UGA区

  q 语句的并行执行,允许分配进程间的消息缓冲区,这些缓冲区用于协调并行查询服务器。

  q 备份,在某些情况下用于RMAN磁盘I/O 缓冲区。

  可以看到,这些内存分配都不应该在LRU缓冲区池中管理,因为LRU缓冲区池的目标是管理小块的内存。例如,对于共享服务器连接内存,一旦会话注销,这个内存就不会再重用,所以应该立即返回到池中。另外,共享服务器UGA内存分配往往“很大”。如果查看前面使用SORT_AREA_RETAINED_SIZE或PGA_AGGREGATE_TARGET的例子,可以看到,UGA可能扩张得很大,成为绝对大于4 KB的块。把MTS内存放在共享池中,这会导致把它分片成很小的内存,不仅如此,你还会发现从不重用的大段内存会导致可能重用的内存老化。这就要求数据库以后多做更多的工作来重建内存结构。

  对于并行查询消息缓冲区也是如此,因为它们不能根据LRU原则来管理。并行查询消息缓冲区可以分配,但是在使用完之前不能释放。一旦发送了缓冲区中的消息,就不再需要这个缓冲区,应该立即释放。对于备份缓冲区更是如此,备份缓冲区很大,而且一旦Oracle用完了这些缓冲区,它们就应该“消失”。

  使用共享服务器连接时,并不是一定得使用大池,但是强烈建议你使用大池。如果没有大池,而且使用了一个共享服务器连接,就会像Oracle 7.3及以前版本中一样从共享池分配空间。过一段时间后,这会导致性能恶化,一定要避免这种情况。如果DBWR_IO_SLAVES或者PARALLEL_MAX_SERVERS参数设置为某个正值,大池会默认为某个大小。如果你使用了一个用到大池的特性,建议你手动设置大池的大小。默认机制一般并不适合你的具体情况。



本文转自

http://book.csdn.net/bookfiles/82/100827103.shtml

你可能感兴趣的:(oracle,数据库,服务器,语言,parallel,磁盘)