为了在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'', ''1'', ''1'', ''1'', ''1'', ''1'')';  
    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.   

    无论用哪种方式,最终都是要用insert语句进行数据插入的,而调用的方式并不是主要的,对于用oracle存储过程的方式,建议如下:1. 不要用动态sql,动态sql要在执行时解析,性能低
    2. 插入过程中不要用commit,执行完成后一次性commit根据上面的建议对于存储过程的修改如下:create or replace procedure INSERT_TEST(num in number) is 
      v_Sql varchar2(1000); 
      begin 
        FOR i IN 1..num LOOP 
          INSERT INTO test values('1','1','1','1','1','1'); 
        END LOOP; 
        COMMIT; 
      end INSERT_TEST;
      

  2.   

    插入50万条数据二楼的执行时间是12.688秒,比java的prepareStatement差不少。
      

  3.   

    建议用sqlloader加快数据导入。