variable possibility to bring the performance down ,
at first , check hit ratio (do it in peak hour)
select pr.value "Physical Reads",
       cg.value "Consistent Gets",
       bg.value "DB Block Gets",
       round((1-(pr.value/(bg.value+cg.value)))*100,2) "Hit Ratio"
from   v$sysstat pr, v$sysstat bg, v$sysstat cg
where pr.name = 'physical reads'
and   bg.name = 'db block gets'
and   cg.name = 'consistent gets'IF Percent is less than 70% , increase DB_BLOCK_BUFFERSselect sum(pins) "Executions",
       sum(reloads) "Cache Misses Executing",
       (sum(reloads)/sum(pins)*100) "% Ratio"
from v$librarycacheIf % Ratio is above 1% , increase SHARE_POOL_SIZE.select sum(gets) "Data Dictionary Gets",
       sum(getmisses) "Get Misses",
       100*(sum(getmisses)/sum(gets)) "Ratio"
from v$rowcacheIf % Ratio is above 12% , increase SHARED_POOL_SIZE

解决方案 »

  1.   

    最后一句执行结果如下:
    Data Dictionary Gets Get Misses     Ratio
    -------------------- ---------- ---------
                  306110       1998 .65270654
    是否增加 shared_pool_size??
      

  2.   

    解释一下black_snail的三条检测语句的意思
    1.检测高速缓存的命中率 (高速缓存中存放的是最近被访问的数据块,经验值最好是90%或更高)
    2.检测库缓存的命中率  (库缓存中存放的是最近执行SQL语句的执行计划和解析树,越接近1越好)
    3.监测数据字典的命中率 (数据字典缓存区存放的是最近被访问的数据字典的信息,85%以上最好),根据你的检测结果,该值不用修改。
    另外,我建议你可以为数据量大的表,建立partition,将大表通过时间戳拆分为若干个小表,即便于维护,亦提高了查询的速度。
      

  3.   

    500万的表不用分区都可以的。
    不知道楼主的数据助理都做什么动作?update?insert?
    应该和那些命中率没有关系。
    可不可以把init.ora贴出来看看。
      

  4.   

    前端用pb编写,执行我所说的语句共有9页代码(A4纸)。我想应不是和代码有多大关系的,我所有的表都建有主键和索引,关键的是在相同的条件下,重启计算机就能在短时间内提高速度,无法理解.能不能通过Sever为服务器运行的roacle程序分配更多的内存解决?方法是怎样的?
    谢谢!
      

  5.   

    init.ora摘要
    open_cursors = 100
    max_enabled_roles = 30
    db_file_multiblock_read_count = 8  # INITIAL
    # db_file_multiblock_read_count = 8                                   # SMALL
    # db_file_multiblock_read_count = 16                                  # MEDIUM
    # db_file_multiblock_read_count = 32                                  # LARGEdb_block_buffers = 19200  # INITIAL
    # db_block_buffers = 100                                              # SMALL
    # db_block_buffers = 550                                              # MEDIUM
    # db_block_buffers = 3200                                             # LARGEshared_pool_size = 52428800  # INITIAL
    # shared_pool_size = 3500000                                          # SMALL
    # shared_pool_size = 5000000                                          # MEDIUM
    # shared_pool_size = 9000000                                          # LARGElarge_pool_size = 614400
    java_pool_size = 20971520log_checkpoint_interval = 10000
    log_checkpoint_timeout = 1800processes = 59  # INITIAL
    # processes = 50                                                      # SMALL
    # processes = 100                                                     # MEDIUM
    # processes = 200                                                     # LARGEparallel_max_servers = 5  # SMALL
    # parallel_max_servers = 4 x (number of CPUs)                         # MEDIUM
    # parallel_max_servers = 4 x (number of CPUs)                         # LARGElog_buffer = 32768  # INITIAL
    # log_buffer = 32768                                                  # SMALL
    # log_buffer = 32768                                                  # MEDIUM
    # log_buffer = 163840                                                 # LARGE
      

  6.   

    现在还没搞清楚你是查询速度慢,还是DML(INSERT、UPDATE、DELETE)速度慢,
    不同的操作语句性能低的原因和优化方式都不尽相同。所以还是请更清楚地描述
    你所做的操作吧。
      

  7.   

    我的9页代码中有insert,update,retrieve(),自定交函数调用,select 等.
      

  8.   

    是不是只有这个前台的程序的速度受影响,还是别的查询都受到影响如果是都受影响那就是oracle的设置有问题了如果只有这个受影响那就应该是程序的问题了在这么复杂的程序中尽量把复杂的sql拆开,写成简单的语句分步执行也可以用一些临时表你说的那个“能不能通过Sever为服务器运行的roacle程序分配更多的内存解决”可以用alter session sort_area_size=50m或者alter session set transaction use rbsxxx,使用一个大的回滚段上面两个命令记得不清楚了,有可能有错这些方法都尝试一下,看看能不能解决问题