存储过程中在一个FOR循环中有一个UPDATE语句。如下:...
FOR ...
  --一些逻辑判断
  UPDATE 语句;
LOOP;
...测试时发现一个现象:当数据在300条左右时(即for循环的执行次数),执行时间1秒不到,而数据量刚刚超过某一个值,大约快到400条时,竟然出奇的慢。这是怎么回事啊?

解决方案 »

  1.   

    内存问题,我不是非常清楚数据库配置的相关知识,很可能就是楼上说的sga或者pga之类的问题。楼主自己去oracle管理器看看性能部分是不是需要重新设置?
      

  2.   

    找到服务器的参数了。但是我现在还是不太明白他们的意思,请指教。
    服务器的内存是512M的。open_cursors = 300
    max_enabled_roles = 30
    db_file_multiblock_read_count = 8db_block_buffers = 16068shared_pool_size = 43877683large_pool_size = 614400
    java_pool_size = 20971520log_checkpoint_interval = 10000
    log_checkpoint_timeout = 1800processes = 150parallel_max_servers = 5log_buffer = 32768
      

  3.   

    还有一个参数:
    db_block_size = 8192
      

  4.   

    如果是内存小了,怎么修改呢?是修改这个参数吗db_block_buffers?那参数open_cursors = 300
    是什么意思?谁能解释一下。
      

  5.   

    我计算了一下,得到下面的数据(服务器win2000 server):
      log_buffer:32K
      large_pool_size:614400/1024/1024=0.585938M(这个不是这么算吗?数据很奇怪。)
      java_pool_size:20M
      data buffer:125M (db_block_size * db_block_buffers)
      
    是large_pool_size的设置有问题吗?
      

  6.   

    关于open_cursors有下面的解释:
       Oracle 使用 OPEN_CURSORS 参数指定一个会话一次最多可以打开的游标的数量。超过此数量时,Oracle 将报告 ORA-01000 错误。当此错误传播到 WebLogic Server 时,就会抛出 SQLException。
      

  7.   

    谢谢你,楼主。oracle9i的sga 好像就是这些参数:data buffers,  redo log buffer,share pool,但是10g是不是就是这个参数拉,我在init中没有找到其他的参数
    ###########################################
    # SGA Memory
    ###########################################
    sga_target=167772160