Oracle 10g内存结构体系学习总结

http://tech.ddvip.com   2008年08月26日    社区交流

内容摘要:学习了Oracle 10g,对其体系机构有了一个大体的认识,这次对其内存体系机构作个总结。这里主要讨论sga和pga:

  学习了近5个月的Oracle 10g,对其体系机构有了一个大体的认识,这次对其内存体系机构作个总结:

  1,Sga :系统全局区

  2,pga: 进程全局区

  3,Uga:用户全局区(是共享服务器,uga在sga中分配,是专有服务器,uga在pga分配)

  这里主要讨论sga和pga:

  目前在Oracle 10g中有手动和自动内存管理,自动内存管理和SQL SERVER 类似,自己来管理和分配内存。pga是内存的一个“堆”;

  PGA(进程全局区)

  我们先看看手动PGA管理:有以下参数

  1,SOrt_AREA_SIZE: 信息换出磁盘之前,用于内存中排序的总量(对与合并联结算法适用)

  2,SOrt_AREA_RETAINED_SIZE: 排序完成后,保存已经排序的数据的内存总量

  3,HASH_AREA_SIZE; 在内存中散列表使用的内存量(用于Hash联结时,小表在内存中生成的数据)

  上面这几个参数,是对一个session中设置的。一般就是几M大小左右,如果太大了,服务器内存也不够啊,想想几千人吧,那数据就是多少个G了。

  这些参数,就是控制排序和hash所用的内存量,都是设置的上限。

  如果这些数据设置得太小,数据库就会将数据写的临时表里存储起来。一般设置手动pga设置比较麻烦,oracle现在可以实现了自动PGA管理。

  在Oracle中设置pga的管理方式:

  WorkArea_Size_Policy:

  设置为manual为手动pga管理

  设置为Auto为自动pga管理,10g以上是默认Auto管理

  当WorkArea_Size_Policy=Auto时,必须设置pga_aggregate_target的值大小

  pga_aggregate_target: 是排序和hash联结的所有使用的总内存大小;

  SGA(系统全局区)

  一般dba是通过配置(缓存区缓存,日志缓存,共享池,大池和Java池)来微调系统的。

  日志缓存:

  又叫重做日志缓存区:是将数据写到在线重做日志当中,则在写到磁盘前要在”重做缓存区“中临时缓存一些数据。

  数据不会在“重做缓存区”里停留很长时间,LGWR会在以下情况下触发:

  1,每3秒一次

  2,无论何时提交请求

  3,LGWR切换日志时

  4,重做日志区1/3满时,或者包含了1M日志数据时。

  一般重做事务日志就几M,超过了3M就没意义了。

  缓存区缓存:

  就是“数据缓存”,太小,查询执行不完,太大,其他进程就缺少内存。

  分3个位置:

  ”default 默认池“ :默认数据都放在这个池中缓存,如果有些数据长期不用,数据会被踢出缓存。

  “keep 保存池 ”:一般将访问比较频繁的数据放在这个池中。此池的数据一直保存(除非其他段要数据),数据不会被踢出

  ”Recycle 回收池“:是将不适合缓存的数据放在这个池中,以免因为这个数据比较大,将其他池的数据踢出缓存。

  回收池要小一些,以保证大的数据快速进入和离开缓存。

  共享池

  设计共享池为了反复使用执行计划。数据字典缓存,系统参数

  运行的PL/SQL代码就在共享池里缓存,一般此池不会很大,一般也就300-500M就可以了。

  大池

  因为它用于“大块”内存的分配,共享池不会处理如此大的内存。一般主要用于备份。

  JAVA池

  支持数据库中的java代码。一般比较小

  流池

  设计数据库的共享和复制,设计流池可以避免在流数据库特性下”窃取“共享池10%的空间

  自动设置SGA的大小:

  通过设置Sga_Target来配置大小,这样数据库可以动态调整数据各个池的大小。

作者:zping    责编:豆豆技术应用

正在加载评论...