PGA是用户进程区域,这是一个私有的进程区域,这个区域里面包含了与某个特定服务器进程相关的控制信息和数据,对于每一个服务器进程来讲都有一个与之对应的PGA内存区域,这个区域之所以说是私有的是因为进程和进程之间并不会共享同一个PGA区,因此我们在PGA中就看不到有类似于latch的低级串行锁。PGA中包含两个区域一个是fixed pga,其中包含了一些PGA的结构信息,最主要的是他保留了一个指针,指向了PGA中的第二个区域variable PGA,这里面包含的是一些永久性的内存,对于dedicated server模式的进程来讲对于其中的每一个session的UGA就包含在variable PGA区域中,反过来对于shared server模式的进程,UGA就会包含在SGA中,也就是我们通常所说的Large pool中。那么UGA他的结构基本类似于PGA也分为fixed和variable两个区域,其中主要保存了session用户的登陆信息,以及比较重要的private sql area.
private sql area对于UGA来讲是很重要的一个针对session级别的个区域,其大小取决于SQL语句的复杂程度,其中也包含两个区域,分别是:存放bind var以及数据类型等游标信息的永久内存区域,以及处理SQL语句过程中(包括Sort,hash_join等操作)所创建的运行时区域,其中永久内存区域直到cursor关闭情况下才会被释放,而运行时区域会在sql语句执行结束后就被释放,其中就管理PGA来说,主要就是针对UGA中这个private sql area来进行管理. Oracle为执行sql的每一个session分配一个private sql area,这个区域还存储了一个很重要的地址信息用来指向存储在library cache中的shared sql area,里面保存了SQl的执行计划。Oracle建议程序开发过程中尽量多使用bind variable目的就是为了降低hard parse,直接意思的理解就是让我们尽量重用library cache中的SQL执行计划,这样就可以降低share pool latch和library cache latch等闩的竞争。其中bind variable从那里来呢?上面其实已经提到了就是在private sql area中的永久内存区域存在,这个区域只有在游标关闭的状态下才被释放。这里最后要了解的是,永久内存或者是运行时内存的释放并不是将内存反还给OS,而是反还给了UGA.