单条语句insert

前几天我又研究了下单条数据的插入,实际上我们这种方式大量的
时间消耗在了客户端与服务器之间的通信上,因此后来我用bulk的方式以plsql在两种情况下

进行了测试,一种是人为构造数据,字段数和记录长度和我们告警数据类似或者略大,另一种是从现有

告警表取数据然后插入目的表,这两种情况下的速度bulk方式都要比普通的方式快一倍左右。

它的实现原理其实就是实现了批量,减小了客户端和服务器间交互的时间。
具体测试的时间如下,每次的数据量都是100万条。这两种模式下我已经测试过多次,结果
还是比较可靠稳定的。
  普通方式 bulk方式
构造数据 100m 47m
从现有告警表取数据 102m 55m
另外,我这里是用plsql的方式来实现的,oci,pro*c,java等不同方式应该都有类似的
实现,不同场景不同情况下性能可能略有出入,但偏差应该不是很大。
下面是具体的测试过程,我已经去掉了很多无关紧要的信息,
应该比较方便看,您有兴趣可以看下。

SQL*Plus: Release 11.2.0.3.0 Production on Mon Jun 3 08:46:33 2013
Copyright (c) 1982, 2011, Oracle. All rights reserved.
SQL> conn test4/test4;
Connected.
SQL> show user
USER is "TEST4"
构造数据
普通方式
SQL> select count(*) from t2;
COUNT(*)
----------
1000000
SQL> truncate table t2;
Table truncated.
SQL> select count(*) from t2;
COUNT(*)
----------
0

SQL> set time on
08:47:35 SQL>
08:47:35 SQL>
08:47:46 SQL>
08:47:46 SQL> declare
08:47:47 2 i number:=0;
08:47:47 3 begin
08:47:47 4 for i in 1..1000000 loop
08:47:47 5 insert into t2 values (6, i,11,11,11,11,
08:47:47 6 10,10,10,10,10,10,10,10,10,10,
08:47:47 7 10,10,10,10,10,10,10,10,10,10,
08:47:47 8 10,10,10,10,10,10,10,10,10,10,
08:47:47 9 10,10,10,10,10,10,10,10,10,10,
08:47:47 10 10,10,10,10,10,10,10,10,10,10,
08:47:47 11 10,10,10,10,10,10,10,10,10,10,
08:47:47 12 10,10,10,10,10,10,10,10,10,10,
08:47:47 13 10,10,10,10,10,10,10,10,10,10,
08:47:47 14 10,10,10,10,10,10,10,10,10,10,
08:47:47 15 10,10,10,10,10,10,10,10,10,10,
08:47:47 16 10,10,10,10,10,10,10,10,10,10,
08:47:47 17 10,10,10,10,10,10,10,10,10,10,
08:47:47 18 10,10,10,10,10,10,10,10,10,10,
08:47:47 19 10,10,10,10,10,10,10,10,10,10,
08:47:47 20 10,10,10,10,10,10,10,10,10,10,
08:47:47 21 10,10,10,10,10,10,10,10,10,10,
08:47:47 22 10,10,10,10,10,10,10,10,10,10,
08:47:47 23 10,10,10,10,10,10,10,10,10,10,
08:47:47 24 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
08:47:48 25 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
08:47:48 26 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
08:47:48 27 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
08:47:48 28 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
08:47:48 29 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
08:47:48 30 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
08:47:48 31 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
08:47:48 32 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
08:47:48 33 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
08:47:48 34 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
08:47:48 35 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
08:47:48 36 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
08:47:48 37 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
08:47:48 38 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
08:47:48 39 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
08:47:48 40 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
08:47:48 41 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
08:47:48 42 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
08:47:48 43 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
08:47:48 44 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');
08:47:48 45 end loop;
08:47:48 46 end;
08:47:49 47 /
PL/SQL procedure successfully completed.
08:49:29 SQL> COMMIT;
Commit complete.
08:49:57 SQL> select count(*) from t2;
COUNT(*)
----------
1000000
08:50:17 SQL> truncate table t2;
Table truncated.
bulk方式
08:51:21 SQL> declare
08:51:23 2 TYPE NumTab IS TABLE OF t2.id%TYPE INDEX BY PLS_INTEGER;
08:51:23 3 pnums NumTab;
08:51:23 4 iterations CONSTANT PLS_INTEGER := 1000000;
08:51:23 5 begin
08:51:23 6 FOR j IN 1..iterations LOOP -- populate collections
08:51:23 7 pnums(j) := j;
08:51:23 8 end loop;
08:51:23 9 FORALL i IN 1..iterations
08:51:23 10 insert into t2 values (pnums(i),11,11,11,11,11,
08:51:23 11 10,10,10,10,10,10,10,10,10,10,
08:51:23 12 10,10,10,10,10,10,10,10,10,10,
08:51:23 13 10,10,10,10,10,10,10,10,10,10,
08:51:23 14 10,10,10,10,10,10,10,10,10,10,
08:51:23 15 10,10,10,10,10,10,10,10,10,10,
08:51:23 16 10,10,10,10,10,10,10,10,10,10,
08:51:23 17 10,10,10,10,10,10,10,10,10,10,
08:51:23 18 10,10,10,10,10,10,10,10,10,10,
08:51:23 19 10,10,10,10,10,10,10,10,10,10,
08:51:23 20 10,10,10,10,10,10,10,10,10,10,
08:51:23 21 10,10,10,10,10,10,10,10,10,10,
08:51:23 22 10,10,10,10,10,10,10,10,10,10,
08:51:23 23 10,10,10,10,10,10,10,10,10,10,
08:51:23 24 10,10,10,10,10,10,10,10,10,10,
08:51:23 25 10,10,10,10,10,10,10,10,10,10,
08:51:23 26 10,10,10,10,10,10,10,10,10,10,
08:51:23 27 10,10,10,10,10,10,10,10,10,10,
08:51:23 28 10,10,10,10,10,10,10,10,10,10,
08:51:23 29 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
08:51:23 30 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
08:51:23 31 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
08:51:23 32 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
08:51:23 33 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
08:51:23 34 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
08:51:23 35 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
08:51:23 36 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
08:51:23 37 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
08:51:23 38 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
08:51:23 39 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
08:51:23 40 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
08:51:23 41 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
08:51:23 42 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
08:51:23 43 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
08:51:23 44 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
08:51:23 45 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
08:51:23 46 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
08:51:23 47 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
08:51:23 48 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
08:51:23 49 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');
08:51:23 50 end;
08:51:24 51 /
PL/SQL procedure successfully completed.
08:52:11 SQL> commit;
Commit complete.

08:52:25 SQL> select count(*) from t2;
COUNT(*)
----------
1000000
从现有告警表插入
普通方式

09:08:37 SQL> truncate table t1;
Table truncated.
09:08:44 SQL>
09:08:45 SQL> DECLARE
09:08:51 2 BEGIN
09:08:51 3 FOR cur IN (SELECT * FROM test.TFA_ALARM_ACT1 where rownum<1000001) LOOP
09:08:51 4 INSERT INTO t1 VALUES cur;
09:08:51 5 END LOOP;
09:08:51 6 END;
09:08:51 7 /
PL/SQL procedure successfully completed.
09:10:33 SQL> commit;
Commit complete.
09:10:39 SQL> select count(*) from t1;
COUNT(*)
----------
1000000
09:10:45 SQL> truncate table t1;
Table truncated.
09:13:40 SQL> select count(*) from t1;
COUNT(*)
----------
0
bulk方式

09:14:12 SQL>
09:14:12 SQL> DECLARE
09:14:13 2 CURSOR cur IS
09:14:13 3 SELECT * FROM test.TFA_ALARM_ACT1 where rownum<1000001;
09:14:13 4 TYPE rec IS TABLE OF test.TFA_ALARM_ACT1%ROWTYPE;
09:14:13 5 recs rec;
09:14:13 6 BEGIN
09:14:13 7 OPEN cur;
09:14:13 8 WHILE (TRUE) LOOP
09:14:13 9 FETCH cur BULK COLLECT
09:14:13 10 INTO recs LIMIT 100;
09:14:13 11 FORALL i IN 1 .. recs.COUNT
09:14:13 12 INSERT INTO t1 VALUES recs (i);
09:14:13 13 EXIT WHEN cur%NOTFOUND;
09:14:13 14 END LOOP;
09:14:13 15 CLOSE cur;
09:14:13 16 END;
09:14:13 17 /
PL/SQL procedure successfully completed.
09:15:08 SQL> commit;
Commit complete.

09:15:25 SQL> select count(*) from t1;
COUNT(*)
----------
1000000
请使用浏览器的分享功能分享到微信等