为了在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) 直接用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存储过程大批量写入数据有没有性能更快的方式,谢谢!
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;
FORALL i IN 1..num LOOP
Insert into TEST values('1', '1', '1' '1', '1', '1');
END LOOP;
COMMIT;
end INSERT_TEST;