《Oracle编程艺术》第四章-内存结构,4.1.1手动PGA内存管理(小节简介)

PGA是特定于进程的一段内存。换句话说,它是操作系统中某个进程或线程专用的内存,不允许系统中的其他进程或线程访问。

PGA一般是通过C语言运行时调用malloc()或memmap()来分配,而且可以在运行时动态扩大(或收缩)。PGA绝不会在SGA中分配,而总是由进程或线程为自身分配。PGA中的P代表Process(进程)或Program(程序),是不共享的。

 

UGA实际上来说,是你的会话的状态。它是一段你的会话一直能访问到的内存。UGA的分配位置完全取决于你如何连接Oracle。如果是通过共享服务器方式连接,UGA肯定存储在每个共享服务器进程都能访问的内存中,也就是SGA。如果是这样,你的会话可以使用任何共享服务器进程来连接数据库,因为任何一个共享服务器进程都能读写你的会话的数据。

另一方面,如果使用一个专用服务器连接,则不再需要其他进程都能访问你的会话状态,这时候UGA几乎成了PGA的同义词。实际上,UGA就包含在PGA中。查看系统统计信息时可以看到,采用专用服务器模式时,总会看到UGA实在PGA中(PGA内存大于等于UGA所用的内存,也就是说PGA内存的大小会包含UGA的大小)。所以,PGA包含进程内存,还可能包含UGA。

PGA内存中的其他区域通常用于完成内存中的排序、位图合并以及散列。可以肯定的说,除了UGA,这些区域在PGA中占的比重最大。

 

从Oracle Database 9i Release 1起,有两种办法来管理PGA中的这些非UGA内存。

1.手动PGA内存管理。要告诉Oracle数据库,如果一个进程中需要完成排序或散列,允许使用多少内存来完成这些排序或散列。

2.自动PGA内存管理。要告诉Oracle数据库,PGA在系统范围内可以尝试使用多少内存。

从Oracle Database 11g Release 1开始,自动PGA内存管理可以使用以下两种技术实现。

1.通过设置PGA_AGGREGATE_TARGET初始化参数,告诉Oracle数据库在实例范围内PGA可以尝试使用多少内存

2.通过设置MEMORY_TARGET初始化参数,告诉Oracle数据库实例应当允许SGA和PGA总共使用多大内存。数据库将根据这个参数确定合适的PGA大小。

 

分配和使用内存的方式因情况不同而有很大的差异,因此分别讨论。

PGA内存管理方式受数据库初始化参数WORKAREA_SIZE_POLICY的控制,而且可以在会话级别进行修改。在Oracle Database 9i Release 2及更高版本中,这个舒适化参数默认为AUTO,表示自动PGA内存管理。而在Oracle Database 9i Release 1中,这个参数的默认设置为MANUAL--手动管理。

发布了57 篇原创文章 · 获赞 20 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/shafatutu/article/details/95011290