zoukankan      html  css  js  c++  java
  • oracle结构-内存结构与动态内存管理

    内存结构与动态内存管理

    内存是影响数据库性能的重要因素。
      oracle8i使用静态内存管理,即,SGA内是预先在参数中配置好的,数据库启动时就按这些配置来进行内在分配,oracle10g引入了动态内存管理,即在数据库运行过程中,内存大小可以在线修改与自动配置。
      oracle数据库的内存可以分为:系统全局区、程序全局区、排序区、大池、java池。
    一、系统全局区(SGA)
      系统全局区的数据被多个用户共享。当数据库实例启动时,系统全局区内存被自动分配。SGA按作用的不同,又分为:数据缓冲区、日志缓冲区、共享池。
    1.数据缓冲区
      数据缓冲区用于存储从磁盘数据文件中读入的数据,供所有用户共享。修改、插入的数据存储在数据缓冲区中,修改完成或DBWR进程执行时,数据被写入数据文件。
      几个概念:
    LRU:最近最少使用,系统按这个原则对缓冲区中的数据进行替换。
    Dirty:脏数据,指修改后还没有写到数据文件中的数据。
      在9i之前,数据缓冲区的大小是由DB_BLOCK_BUFFER确定,之后的版本中,是由参数DB_CACHE_SIZE及DB_nK_CACHE_SIZE确定。不同的表空间可以使用不同的块大小,在创建表空间中加入参数BLOCKSIZE指定该表空间数据块的大小,如果指定的是2k,则对应的缓冲区大小为DB_2K_CACHE_SIZE参数的值,如果指定的是4k,则对应的缓冲区大小为DB_4K_CACHE_SIZE参数的值,以此类推。如果不指定BLOCKSIZE,则默认为参数DB_BLOCK_SIZE的值,对应的缓冲区大小是DB_CACHE_SIZE的值。
      缓冲区的设置对性能影响是很突出的。设一个查询要读取的数据块数为A,能够从缓冲区读取到的数据块数为C,需要从磁盘读取的数据块数为D,那么A+C+D,则C/A称为数据缓冲区的命中率。以下语句计算数据缓冲区的命中率:
    SQL>SELECT A.VALUE+B.VALUE "LOGICAL_READS",C.VALUE "PHYS_READS",
        ROUND(100*((A.VALUE+B.VALUE)-C.VALUE)/(A.VALUE+B.VALUE)) "BUFFER HIT RATIO"
        FROM V$SYSSTAT A,V$SYSSTAT C 
        WHERE A.STATICSTIC#=38 AND B.STATISTIC#=39 AND C.STATICSTIC#=40
    一般要求命中率在90%以下,如果命中率太低,就应适当调整数据缓冲区的大小。

    2.日志缓冲区
      日志缓冲区用于缓冲事务日志,在适当的时候再由LGWR进程写入日志文件。日志缓冲区的大小由参数LOG_BUGGER设定。
      日志在进入日志缓冲区时,如果日志缓冲区过小而没有空闲空间,就要等待LGWR将缓冲区中原有的日志写入日志文件以腾出空闲空间。如果有足够的空闲空间,则无需等待,直接写入日志缓冲区中。那么这个 等待的次数/总次数(等待+非等待) 就称为日志缓冲区的失败率,可以通过以下语句计算:
    sql>select name,gets,misses,immediate_get,immediate_misses,
        decode(gets,0,0,misses/gets*100 ratio1,
        decode(immediate_gets+immdiate_misses,0,0,immediate_misses/(immdiate_gets+immediate_misses)*100) ratio2
        from v$latch where name in ('redo allocation','redo copy');
      显然,失败率也是影响性能的重要因素,就要实际情况调整log_buffer的大小。

    3.共享池
      共享池是对sql,pl/sql程序进行语法分析,编译,执行的内存区域。包括:库缓冲区(library cache),数据字典缓冲区(data dictinary cache),用户全局区(user global area)三个部分。
      共享池的大小由参数shared_pool_size设定。
      查询数据字典的成功与失败次数:
    sql>select sum(gets) "dictionary gets",
               sum(getmisses) "dictionary cache getmisses",
               from v$rowcache
       计算共享池记取数据字典的成功率:
    sql>select parameter,gets,getmisses,getmisses/(gets+getmisses)*100 "miss ratio",(1-sum(getmisses)/sum(gets)+sum(getmisses))))*100 "hit ratio" from v$rowcache where gets+getmisses<>0 group by parameter,gets,getmisses;
      计算缓存的失败率,结果应小于1%:
    sql>select sum(pins) "total pins",sum(reloads) "total reloads",
               sum(reloads)/sum(pins)*100 libcahe from v$librarycache;

      以上分析了SGA的三个部分,要查看SGA的总大小或空闲空间,使用比率,如下:
    sql>select * from v$sga
    sql>select name,sgasize/1024/1024 "allocated(m)",bytes/1024 "空闲空间百分比(%)" from (select sum(bytes) sgasize from sys.v_$sgastat) s,sys.v_sgastat f where f.name='free mamory';

    二、程序全局区
      程序全局区(PGA)是包含单个用户或服务器数据的控制信息的内存区域。是在用户进程连接到oracle数据库并创建一个会话时,由oracle自动分配的,它是非共享区,主要用于在编程时存储变量与数组。会话结束时,PGA被释放。

    三、排序区
      排序区用于sql的order by。oracle优先使用排序区进行排序,如果内存不够,oracle自动使用临时表空间进行排序。
      参数sort_area_size用于设置排序区的大小。

    四、大池
      大池用于数据库备份工具-RMAN。
      大池的大小由参数large_pool_size确定。

    五、java池
      从8i开始,oracle增加了对java的支持,所以系统提供了java池,其大小由参数java_pool_size设定。

    六、oracle10g的自动共享内存管理
    1.什么是自动共享内存管理?

      在10g以前的版本中,SGA的各个部分,share_pool_size,db_cache_size等需要由管理员手动设置大小,当数据库负荷太大时,若没有调整这些参数的大小,就会产生“无法分配内存”的错误。在10g中,将参数statistics_level设置为typecal 或all,再使用新参数SGA_TARGET设置SGA内存区的部大小即可,无需定义每个参数的大小,系统会根据需要自动在多个组件之间分配内存大小。

    2.自动共享内存管理时,设置SGA各部分内存参数的最小值限制
      如果同时设置了SGA_TARGET和各内存参数,如:
    SGA_TARGET=300M
    SHARED_POOL_SIZE=32M
    DB_CACHE_SIZE=90M
    则表示共享池和数据缓冲区至少会分配32M和90M内存,剩下的可由系统自动分配的内存为:
    300-32-90=172M

    3.手动内存管理转换为自动管理
      只要设置新参数SGA_TARGET即可,如:
    SGA_TARGET=1000M
       在自动内存管理模式下,如果数据库使用SPFILE,那么在数据库关闭后,系统会将上一次数据库关闭时的内存分配状态记录下来。因此,如果是自动内存管理,最好使用SPFILE而非PFILE。 

  • 相关阅读:
    Realtime crowdsourcing
    maven 常用插件汇总
    fctix
    sencha extjs4 command tools sdk
    首次吃了一颗带奶糖味的消炎药,不知道管用不
    spring mvc3 example
    ubuntu ati driver DO NOT INSTALL recommand driver
    yet another js editor on windows support extjs
    how to use springsource tools suite maven3 on command
    ocr service
  • 原文地址:https://www.cnblogs.com/trhimily/p/3858348.html
Copyright © 2011-2022 走看看