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了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值