Oracle的3 个主要的内存结构。
如果使用共享服务器,UGA就在SGA中分配;如果使用专用服务器,UGA就会在PGA中。
PGA(进程全局区)是特定于进程的一段内存。换句话说,是操作系统进程或线程专用的内存。不允许系统中其他进程或线程访问。
PGA 一般通过C语言的运行时调用malloc()或memmap()来分配。而且可以在运行时动态扩大。
PGA绝对不会在Oracle的SGA中分配,而总是由进程或线程在本地分配。
PGA中的P代表Process 或 Program,是不共享的。
UGA(用户全局区)就是你的会话的状态。会话总能访问这部分内存。UGA的位置完全取决于你如何连接Oracle。
如果通过一个共享服务器连接,UGA肯定存储在每个共享服务器,因为任何一个共享服务器都能读写你的会话数据。
如果使用一个专用服务器连接,则不再需要大家能访问你的会话状态,UGA几乎成了PGA的同义词。UGA就包含在专用服务器的PGA中。查看系统统计信息时可以看到,采用专用服务器模式时,总是会报告UGA在PGA中(PGA大于或等于所用的UGA内存,而且PGA内存的大小会包括UGA的大小)。
有两种方法来管理PGA中的非UGA内存。
自动PGA内存管理可以使用以下两种技术实现:
通过设置PGA_AGGREGATE_TARGET初始化参数,告诉Oracle可以使用多少PGA内存。
通过设置MEMORY_TARGET初始化参数,告诉Oracle数据库实例应当为SGA和PGA总共使用多大内存。数据库自己将根据这个参数确定合适的PGA大小。
有些参数对PGA大小的影响最大。
自动PGA内存管理
建立自动PGA内存管理时,需要为两个实例初始化参数确认适当的值,这两个参数如下所示: