一般比例应该是多少??

解决方案 »

  1.   

    数据块缓存区(data block buffer cache)是SGA中的一个高速缓存区域,用来存储从数据库中读取数据段的数据块(如表、索引和簇)。数据块缓存区的大小由数据库服务器init.ora文件中的DB_BLOCK_BUFFERS参数决定(用数据库块的个数表示)。在调整和管理数据库时,调整数据块缓存区的大小是一个重要的部分。因为数据块缓存区的大小固定,并且其大小通常小于数据库段所使用的空间,所以它不能一次装载下内存中所有的数据库段。通常,数据块缓存区只是数据库大小的1 %~2 %,Oracle使用最近最少使用( LRU,least recently used)算法来管理可用空间。当存储区需要自由空间时,最近最少使用块将被移出,新数据块将在存储区代替它的位置。通过这种方法,将最频繁使用的数据保存在存储区中。然而,如果SGA的大小不足以容纳所有最常使用的数据,那么,不同的对象将争用数据块缓存区中的空间。当多个应用程序共享同一个SGA时,很有可能发生这种情况。此时,每个应用的最近使用段都将与其他应用的最近使用段争夺SGA中的空间。其结果是,对数据块缓存区的数据请求将出现较低的命中率,导致系统性能下降。
    数据库对象的信息存储在数据字典表中,这些信息包括用户帐号数据、数据文件名、段名、盘区位置、表说明和权限,当数据库需要这些信息(如检查用户查询一个表的授权)时,将读取数据字典表并且将返回的数据存储在字典缓存区的SGA中。数据字典缓存区通过最近最少使用(LRU) 算法来管理。字典缓存区的大小由数据库内部管理。字典缓存区是SQL共享池的一部分,共享池的大小由数据库文件init.ora中的SHARED_POOL_SIZE参数来设置。如果字典缓存区太小,数据库就不得不反复查询数据字典表以访问数据库所需的信息,这些查询称为循环调用(recuesive call),这时的查询速度相对字典缓存区独立完成查询时要低。SHARED_POOL_SIZE由前者组成,至于大小要看你数据库的用途和业务及配置。
      

  2.   

    ORACLE  8.0.X  版本  
     
    SGA=((db_block_buffers  *  block  size)+(shared_pool_size+large_pool_size+log_buffers)+1MB  
     
    ORACLE  8.1.X  版本  
     
    SGA=((db_block_buffers  *  block  size)+(shared_pool_size+large_pool_size+java_pool_size+log_buffers)+1MB  
     
    理论上SGA可占OS系统物理内存的1/2——1/3,我们可以根据需求调整  
     
    我推荐SGA=0.45*(OS  RAM)  
     
    假设服务器运行ORACLE  8.1.X  版本,  OS系统内存为2G  MEM,  db_block_size  是8192  bytes,    
    除了运行ORACLE数据库外,  没有其它的应用程序或服务器软件.  
     
    这样SGA合计约为921M  (  0.45*2048M  ),    
     
    设shared_pool_size  300M  (300*1024*1024  bytes)  
     
    设database  buffer  cache  570M  (72960*8192  bytes)  
     
     initorasid.ora文件里具体各参数如下:  
     
    shared_pool_size  =  314572800  
    #  300  M  
     
    db_block_buffers  =  72960  
    #  570  M  
     
    log_buffer  =  524288  
    #  512k  (128K*CPU个数)  
     
    large_pool_size  =  31457280  
    #  30  M  
     
    java_pool_size  =  20971520  
    #  20  M  
     
    sort_area_size  =  524288  
    #  512k  (65k--2M)  
     
    sort_area_retained_size  =  524288  
    #  MTS  时  sort_area_retained_size  =  sort_area_size  
     
    SUN  Solaris里/etc/system文件里的几个参数同样跟内存分配有关  
     
    ORACLE安装时缺省的设置:  建议修改的设置:    
    set  shmsys:shminfo_shmmax=4294967295    
    set  shmsys:shminfo_shmmin=1    
    set  shmsys:shminfo_shmmni=100    
    set  shmsys:shminfo_shmseg=15    
    set  semsys:seminfo_semmns=200    
    set  semsys:seminfo_semmni=70    
    set  ulimit=3000000      
    set  semsys:seminfo_semmni=315  
    set  semsys:seminfo_semmsl=300  
    set  semsys:seminfo_semmns=630  
    set  semsys:seminfo_semopm=315  
    set  semsys:seminfo_semvmx=32767  
    set  shmsys:shminfo_shmmax=4294967295  
    set  shmsys:shminfo_shmmni=315  
    set  shmsys:shminfo_shmseg=10  
    set  shmsys:shminfo_shmmin=1    
     
    其中这些参数的含义  
     
    shmmax  -  共享内存段,建议设大点,  达到最大SGA  
    shmmin  -  最小的共享内存段.  
    shmmni  -  共享内存标志符的数量.  
    shmseg  -  一个进程可分配的最大内存段数.  
    shmall  -  最大可允许的内存数,比SGA还要大.  
    semmns  -  信号灯,跟ORACLE的PROCESS数有关.  
    semmsl  -  一个信号灯中最大的信号灯数.  
     
     
    ---------------------------------------------------------------  
     
    分析你的init.ora  
    shared  pool    31,457,280    #30M  
    data  buffers  4326*8192=  35,438,592  #35M  
    large  pool    614,400        #600K  
    #多线程  
    mts_dispatchers  =  "(protocol=TCP)(tick=15)(pool=true)"  
    ---------------------  
    这样,如果你认为你的语句已经优化了,如果你的内存也不是太大的话。  
    对于  shared  pool和data  buffers的大小已经够了。  
    但是,你又用了多线程,又只把large  pool配置了600k  
    你要么先把多线程去掉,要么把large  pool加大(30M)试试(多线程用到了large  pool)。  
    最后,把你的init文件中的一些参数还调整一下  
    db_file_multiblock_read_count  =  8    #可以加大到16  or  32试试  
    把  
    oracle_trace_collection_name  =  ""  
    system_plan  
    这注释掉  
      

  3.   

    shared_pool_size 以字节为单位,指定共享池的大小。共享池包含如: 共享游标、存储的过程、控制结构和并行执行消息缓冲区等对象。较大的值能改善多用户系统的性能。这个值不需要太大,一般不超过150M
    db_block_buffers 缓冲区高速缓存中 Oracle 块的数量。database_buffers=db_block_buffers×db_block_size.这个值越大越好,只要整个SGA不超过系统物理内存限制,给最大值