日期:2014-05-16  浏览次数:20453 次

oracle体系结构三部曲之内存结构:PGA&UGA
  PGA是一个进程专用内存,决不允许其他进程访问。通过C语言的运行时调用malloc()分配,可动态扩缩。而且,PGA绝对不会在oracle的SGA中分配,总是由进程在本地分配。
  
  PGA是介于用户与oracle实例之间的关键角色。用户体验最敏感的贡献就在于PGA。


  用户所发出的请求,执行时,是在pga中执行。若在pga中命中,则无须软解析,此时称为软软解析。pga中的游标指向database_buffer_cache中的数据行。返回时,是一批批,而非一条条。


  UGA就是你的会话状态。你的会话总能访问这部分内存。UGA的位置取决你如何连接oracle。如果是专用服务器连接,UGA在PGA中创建;如果是共享服务器连接,UGA则在SGA中创建。
  
  所以,PGA包含进程内存,还可能包含UGA。


  手动PGA内存管理受以下参数的控制:


  SQL> show parameters area_size


NAME                                 TYPE                VALUE
------------------------------------ --------------------------------- ------------------------------
bitmap_merge_area_size               integer             1048576             
create_bitmap_area_size                integer             8388608             
hash_area_size                                integer             131072              
sort_area_size                                   integer             65536


  自动内存管理不需要再手工设置上述的参数值。而是,如果:
  1)workarea_size_policy设置为auto
  2)pga_aggregate_target设置为非0
  那么就会引入自动内存管理pga。
  对于OLTP,建议使用auto;对于OLAP,建议使用manual。


    pga内存分配涉及很多方面,其中只有工作区(包含排序区和哈希区)在数据库实例的控制之下。pga_aggregate_target是个上限目标,而非启动时预分配的内存大小。你设置了这个值,就意味着你希望oracle能自由使用多大的内存来完成排序和哈希。实际分配的空间可能超过这个值。如果我们已经超过了pga_aggregate_target,oracle对此是睁一只眼闭一只眼的,只有当os报告称再也没有内存时我们的请求才会失败。oracle睁一只眼是在做什么呢?他会识别已经使用的内存,相应的减少工作区分配的内存大小。如果再请求排序时,就会进行磁盘上I/O了。