我现在有一个程序非常简单,但处理的数据量非常大,有2000万笔左右,并且每天都要处理。处理的过程是这样:对A表中每一条数据都要进行处理,进行一些简单的运算,再插入到B表中,且A表有一个字段是积数,每次每条都要更新。程序写下来非常简单,但执行时间要近两个小时,即使不更新A表也要1个小时左右,更新的话时间更长,请大家帮我想想办法,谢谢!另:B表我已去掉索引,并且建表时也指定了NOLOGGING,A表我没用WHERE条件,因为用不着,且每条记录都要计算,我现在用的方法是在程序中用游标(我用的Pro*C编写)将A表每条记录取出(一次取5万笔,不能再多,多了就报段错误,不过少一个字段可以每次取20万笔,但效率没有明显提高),然后在一个循环中计算,计算完了再插入B表(由于已经很慢,所以没更新A表)

解决方案 »

  1.   

    再网上搜一下oracle的forall语句用法,用它对数据操作的时候是按数据块进行的,
    自己也做过小测试,至少比普通操作快1倍以上,你的数据量大估计效果更明显,再结合/*+ append */使用,效果应该不错的。对A表中每一条数据都要进行处理,进行一些简单的运算
    如果真的很简单的话建议楼主用存储过程实现,不要用程序,转来转去还要走网络,不如直接调用存储过程让数据库搞定,效率应该会很高。
      

  2.   

    我已经加了/*+append*/,不过forall没有用过,我也想过用存储过程,但不好处理,因为在计算时还要读一些参数。
      

  3.   

    我以前作过和你类似的,只要用程序循环处理数据就是这样!!没办法!!!
    我现在用存储过程,你可以分开写,不必都写到一个存储过程,你分析以下,把整个过程 分成一步,两步,三步进行,每一步都传什么参数。2000w对数oracle数据库处理是很简单的
      

  4.   

    PL/SQL, 用BULK COLLECT处理, 至于参数, 可用 OPEN CURSOR FOR Sql statement USING Parameters的形式来处理
      

  5.   

    建议用存储过程。。
    然后写个job每天运行一次。。(速度+愉快)
      

  6.   

    我用DELPHI做过类似的程序,几点建议,希望能对你有所帮助:
    1.尽量减小事务,如果事务太大将会明显降低效率;
    2.尽量减少于数据库的交互,交互很浪费时间的!一些可以用数据库服务器完成的功能尽量用数据库来完成;
    3.尽量优化你的SQL语句,不要使用NOT IN 之类的语句~;
      

  7.   

    楼上,如果每次处理数据在10000条以内,这样对数据库的访问次数会大大增加,是否和你的第2点冲突呢?我的SQL应该非常简单,没有WHERE条件,是全表扫描。请大家继续发表高见,不胜感激!
      

  8.   

    我也有个类似的问题和你差不多,也是想提高性能.我目前的做法是用游标每次只取6000条记录,处理完了后,再取6000条处理.每6000条记录commit一次.