我看教材里面写的是,SGA放的是一些解析好的SQL以及数据字典以及一些从数据文件读来的数据;而PGA则是单个用户请求分配的内存区域,是服务于用户请求的,存放返回给用户的数据集合,在用户断开连接之后,就会被释放。那么这么说SGA跟PGA是2回事,怎么还有PGA会占用SGA的区域呢?这里面到底是什么一回事情呢?

解决方案 »

  1.   

    应该是UGA吧,我百度了下,找了一篇资料,楼主看看吧!系统全局区(System Global Area,SGA):这是一个很大的共享内存段,几乎所有Oracle进程都要访问这个区中的某一点。
    进程全局区(Process Global Area,PGA):这是一个进程或线程专用的内存,其他进程/线程不能访问。
    用户全局区(User Global Area,UGA):这个内存区与特定的会话相关联。它可能在SGA中分配,也可能在PGA中分配,这取决于是用共享服务器还是用专用服务器来连接数据库。如果使用共享服务器,UGA就在SGA中分配;如果使用专用服务器,UGA就会在PGA(即进程内存区)中。进程全局区(PGA)是特定于进程的一段内存。换句话说,这是一个操作系统进程或线程专用的内存,不允许系统中的其他进程或线程访问。PGA一般通过C语言的运行时调用malloc()或memmap()来分配,而且可以在运行时动态扩大(甚至可以收缩)。PGA绝对不会在Oracle的SGA中分配,而总是由进程或线程在本地分配。实际上,对你来说,用户全局区(UGA)就是你的会话的状态。你的会话总能访问这部分内存。UGA的位置完全取决于你如何连接Oracle。如果通过一个共享服务器连接,UGA肯定存储在每个共享服务器进程都能访问的一个内存结构中,也就是SGA中。如果是这样,你的会话可以使用任何共享服务器,因为任何一个共享服务器都能读写你的会话的数据。另一方面,如果使用一个专用服务器连接,则不再需要大家都能访问你的会话状态,UGA几乎成了PGA的同义词;实际上,UGA就包含在专用服务器的PGA中。查看系统统计信息时可以看到,采用专用服务器模式时,总是会报告UGA在PGA中(PGA大于或等于所用的UGA内存;而且PGA内存的大小会包括UGA的大小)。所以,PGA包含进程内存,还可能包含UGA。PGA内存中的其他区通常用于完成内存中的排序、位图合并以及散列。可以肯定地说,除了UGA内存,这些区在PGA中的比重最大。