为了在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) 直接用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存储过程大批量写入数据有没有性能更快的方式,谢谢!
解决方案 »
- 高手帮忙看一个表索引问题。用索引查询反而更慢了
- windows下面安装的oracle 11g 用自带的sql plus 操作的,执行了一下shutdown,在连接就连不上了,请问应该如何操作?
- oracal 10g
- Oracle-01552 Oracle-00600
- 困扰了我六日休息的存储过程
- 不同条件的分组查询sql
- 请问有没有像T_SQL中select * into aaa from bbb这样直接产生新表的句子。
- 我编写了一份数据库开发规范的文档,请大家批评指教!提出好的建议的朋友大大送分!
- 菜鸟在安装Oracle9i时的问题,请高手解答
- 两个select 语句选出的结果怎么会不一样?请斑竹们帮我看看,是什么原因?
- oracle用jdbc连接获取结果的时候能到查询不能用别名?
- 有关oracle 数据块的 问题
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;