学*了*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来配置大小,这样数据库可以动态调整数据各个池的大小。