为了在oracle中大批量的写入数据,我测量了两种方法的性能,一种是直接使用oracle存储过程,另外一种是使用java的prepareStatement,这两种实现方法代码如下:
(1) 直接用Oracle存储过程,分段提交
  create or replace procedure INSERT_TEST(num in number) is
  v_Sql varchar2(1000);
  v_Count number;
  begin
    v_Count:=0;  
    v_Sql:= 'Insert into TEST values(''1'', ''12'', ''123'', ''1234'', ''12345'', ''123456'')';  
    FOR i IN 1..num LOOP
      EXECUTE IMMEDIATE v_Sql; 
      v_Count:=v_Count+1;   
      IF (MOD(v_Count,1000)=0)  THEN
         v_Count:=0;
         COMMIT;
      END IF;
    END LOOP;
    COMMIT; 
  end INSERT_TEST;
  插入50万条数据的时间是14.813秒
(2) 直接用java的prepareStatement,分段提交
  PreparedStatement ps = conn.prepareStatement(insertSql);
  while(i<num){
    ps.setString(1, "1");
    ps.setString(2, "1");
    ps.setString(3, "1");
    ps.setString(4, "1");
    ps.setString(5, "1");
    ps.setString(6, "1");
    ps.addBatch();
    n=n+1;
    if(n%1000==0)
    {
      ps.executeBatch();
      ps.clearBatch();
     }
     i=i+1;
  }  
  插入50万条数据的时间是4.625秒
  以上两种大批量插入数据的方法的性能差别很大,想问一下直接用oracle存储过程大批量写入数据有没有性能更快的方式,谢谢!

解决方案 »

  1.   

    你的测试很不公平诶使用动态sql不说,插入值大小也不一致,还使用无用的mod函数,还多次commit试试下面这个:
    create or replace procedure INSERT_TEST(num in number) is 
      v_Count number; 
      begin 
        v_Count:=0; 
        while v_Count <= 1000 LOOP 
          Insert into TEST values('1', '1', '1', '1', '1', '1');
          v_Count:=v_Count+1; 
        END LOOP; 
        
        COMMIT; 
      end INSERT_TEST; 
      

  2.   

    用oracle存储过程一次性提交写入50万条数据的时间是15.625秒
      

  3.   

    create or replace procedure INSERT_TEST(num in number) is   begin 
         
        FORALL i IN 1..num LOOP 
          Insert into TEST values('1', '1', '1' '1', '1', '1'); 
        END LOOP; 
        COMMIT; 
      end INSERT_TEST;
      

  4.   

    FORALL好像不能单独用,郁闷了
      

  5.   

    三楼的代码有问题,我将Forall改成for,写入50万条记录的的时间是12.688秒
      

  6.   

    嗯,FORALL不似我那样用的,需要与BULK容器合用。