请教高手oracle性能如何优化?
各项参数如何配置,才能系统性能最优?

解决方案 »

  1.   


    表2,设置Oracle配置参数
    参数
    作用
    DB_BLOCK_BUFFERS
    设置系统全局区(SGA,System Global Area)的大小。Oracle使用这个缓冲区保存和处理数据。
    DB_BLOCK_SIZE
    设置内存块的大小。警告:如果改变这个数值,你必须重新构造数据库。在Oracle 8或者更高版本中,它可以设置为32K;在早期版本中,最大限制是16K。
    SHARED_POOL_SIZE
    Oracle用这个内存处理过程、包、触发器。
    SORT_AREA_SIZE
    这是用于排序的内存空间大小。
    每一个Oracle系统都包含上述配置参数。你可以在init.ora中找到这些参数。正确地设置这些参数将对数据库性能产生积极影响。如果你使用Oracle的时间很长,可能经历版本变换(包括次版本号变换),请注意核对这些参数。
    把sga都加载到内存
    pre_page_sga=yes
      

  2.   

    ORACLE    SGA    的分配    
     
                                                                                                               2002-05  
     
    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  
    这注释掉