guitar pro 7 keygen:Oracle 内存结构和进程结构

来源:百度文库 编辑:中财网 时间:2024/05/09 10:51:24

Oracle 内存结构和进程结构

分类: Oracle 2010-01-15 21:16 171人阅读 评论(0) 收藏 举报

Oracle 内存结构如下图:

1:实例(Instance)        
  在一个中,每一个运行的Oracle数据库都与一个数据库实例相联系,实例是我们
 访问数据库的手段。
  实例在操作系统中用ORACLE_SID来标识,在Oracle中用参数INSTANCE_NAME来标识,
 它们两个的值是相同的。数据库启动时,系统首先在内存中分配系统全局区(SGA),
 构成了Oracle的内存结构,然后启动若干个常驻内存的操作系统进程,即组成了Oracle的
 进程结构,内存区域和后台进程合称为一个Oracle实例。

数据库与实例之间是1对1/n的关系,在非并行的数据库系统中每个Oracle数据库与一个
 实例相对应;在并行的数据库系统中,一个数据库会对应多个实例,同一时间用户只与一个
 实例相联系,当某一个实例出现故障时,其他实例自动服务,保证数据库正常运行。在任何
 情况下,每个实例都只可以对应一个数据库。

 2:Oracle 10g动态内存管理
  内存是影响数据库性能的重要因素,Oracle8i使用静态内存管理,Oracle 10g使用动态
 内存管理。所谓静态内存管理,就是在数据库系统中,无论是否有用户连接,也无论并发用
 量大小,只要数据库服务在运行,就会分配固定大小的内存;动态内存管理允许在数据库服
 务运行时对内存的大小进行修改,读取大数据块时使用大内存,小数据块时使用小内存,读
 取标准内存块时使用标准内存设置。


  按照系统对内存使用方法的不同,Oracle数据库的内存可以分为以下几个部分:
  系统全局区:SGA(System Global Area)
  程序全局区:PGA(Programe Global Area)
  排序池:(Sort Area)
  大池:(Large Pool)
  池:( Pool)

 2-1:系统全局区SGA(System Global Area)
   SGA是一组为系统分配的共享的内存结构,可以包含一个数据库实例的数据或控制信
  息。如果多个用户连接到同一个数据库实例,在实例的SGA中,数据可以被多个用户共享。
  当数据库实例启动时,SGA的内存被自动分配;当数据库实例关闭时,SGA内存被回收。
  SGA是占用内存最大的一个区域,同时也是影响数据库性能的重要因素。
  SGA的有关信息可以通过下面的语句查询,sga_max_size的大小是不可以动态调整的。
   =====================================
   SQL> show parameter sga
   NAME                                 TYPE        VALUE
   ------------------------------------ ----------- --------
   lock_sga                             boolean     FALSE
   pre_page_sga                         boolean     FALSE
   sga_max_size                         big integer 164M
   sga_target                           big integer 0
   
   SQL> alter system set sga_max_size=100m;
   alter system set sga_max_size=100m
                 *
   ERROR at line 1:
   ORA-02095: specified initialization parameter cannot be modified
   ======================================  
  

系统全局区按作用不同可以分为:
   数据缓冲区
   日志缓冲区
   共享池

  2-1-1:数据缓冲区(Database Buffer Cache)
    如果每次执行一个操作时,Oracle都必须从磁盘读取所有数据块并在改变它之后
   又必须把每一块写入磁盘,显然效率会非常低。数据缓冲区存放需要经常访问的数据,
   供所有用户使用。修改数据时,首先从数据文件中取出数据,在数据缓冲区中,
   修改/插入数据也在缓冲区中,commit或DBWR(下面有详细介绍)进程的其他条
   件引发时,数据被写入数据文件。
    数据缓冲区的大小是可以动态调整的,但是不能超过sga_max_size的限制。
   ======================================
   SQL> show parameter db_cache_size
   NAME                                 TYPE        VALUE
   ------------------------------------ ----------- -----------------
   db_cache_size                        big integer 24M
   
   SQL> alter system set db_cache_size=128m;
   alter system set db_cache_size=128m
   *
   ERROR at line 1:
   ORA-02097: parameter cannot be modified because specified value is invalid
   ORA-00384: Insufficient memory to grow cache

   SQL> alter system set db_cache_size=20m;
   System altered.
   
   SQL> show parameter db_cache_size;
   NAME                                 TYPE        VALUE
   ------------------------------------ ----------- -----------------
   db_cache_size                        big integer 20M
   
   #此处我仅增加了1M都不行?
   SQL> alter system set db_cache_size=25m;
   alter system set db_cache_size=25m
   *
   ERROR at line 1:
   ORA-02097: parameter cannot be modified because specified value is invalid
   ORA-00384: Insufficient memory to grow cache

   #修改显示格式,方便查看。
   SQL> column name format a40 wrap
   SQL> column value format a20 wrap
   
   #下面语句可以用来查看内存空间分配情况,注意SGA各区大小总和。
   SQL> select name,value from v$parameter where name like '%size' and value <> '0';
   
   #先将java_pool_size调小,然后再修改db_cache_size
   SQL> show parameter java_pool_size;
   NAME                                 TYPE        VALUE
   ------------------------------------ ----------- -----
   java_pool_size                       big integer 48M

   SQL> alter system set java_pool_size=20m;
   System altered.

   SQL> alter system set java_pool_size=30m;
   System altered.
   #上面说明SGA中各区大小总和不能超过sga_max_size。
   =====================================
    数据缓冲区的大小对数据库的存区速度有直接影响,多用户时尤为明显。有些应
   用对速度要求很高,一般要求数据缓冲区的命中率在90%以上。
    下面给出一种计算数据缓冲区命中率的方法:
    使用数据字典v$sysstat
    =====================================
    SQL> select name, value from v$sysstat
         2  where name in('session logical reads',
         3  'physical reads',
         4  'physical reads direct',
         5  'physical reads direct (lob)')
    NAME                              VALUE
    ------------------------------- ----------
    session logical reads               895243
    physical reads                       14992
    physical reads direct                   34
    physical reads direct (lob)              0
    ======================================
    命中率=1-(14992-34-0)/895243

    可以让Oracle给出数据缓冲区大小的建议:
    ======================================
    SQL> alter system set db_cache_advice=on;#打开该功能
    System altered.

    SQL> alter system set db_cache_advice=off;#关闭该功能
    System altered.
    ======================================