--1,以小数据量测试NUMBER类型的INSERT DECLARE V_UPPER NUMBER; BEGIN V_UPPER:=1000; FOR I IN 1..V_UPPER LOOP INSERT INTO T_NUMBER VALUES(I); END LOOP; END; 已用时间: 00: 00: 00.09
--2,以小数据量测试INTEGER类型的INSERT DECLARE V_UPPER INTEGER; BEGIN V_UPPER:=1000; FOR I IN 1..V_UPPER LOOP INSERT INTO T_INTEGER VALULES(I); END LOOP; END; 已用时间: 00: 00: 00.05
--3,以小数据量测试PLS_INTEGER类型的INSERT DECLARE V_UPPER PLS_INTEGER; BEGIN V_UPPER:=1000; FOR I IN 1..V_UPPER LOOP INSERT INTO T_PLS_INTEGER VALUES(I); END LOOP; END; 已用时间: 00: 00: 00.06
--4,以小数据量测试BINARY_INTEGER类型的INSERT DECLARE V_UPPER BINARY_INTEGER; BEGIN V_UPPER:=1000; FOR I IN 1..V_UPPER LOOP INSERT INTO T_BINARY_INTEGER VALUES(I); END LOOP; END; 已用时间: 00: 00: 00.10
--5,以小数据量测试BINARY_FLOAT类型的INSERT DECLARE V_UPPER BINARY_FLOAT; BEGIN V_UPPER:=1000; FOR I IN 1..V_UPPER LOOP INSERT INTO T_BINARY_FLOAT VALUES(I); END LOOP; END; 已用时间: 00: 00: 00.13
--1,以中数据量测试NUMBER类型的INSERT DECLARE V_UPPER NUMBER; BEGIN V_UPPER:=100000; FOR I IN 1..V_UPPER LOOP INSERT INTO T_NUMBER VALUES(I); END LOOP; END; 已用时间: 00: 00: 03.57
--2,以中数据量测试INTEGER类型的INSERT DECLARE V_UPPER INTEGER; BEGIN V_UPPER:=100000; FOR I IN 1..V_UPPER LOOP insert into t_integer values(I); END LOOP; END; 已用时间: 00: 00: 05.
--3,以中数据量测试PLS_INTEGER类型的INSERT DECLARE V_UPPER PLS_INTEGER; BEGIN V_UPPER:=100000; FOR I IN 1..V_UPPER LOOP INSERT INTO T_PLS_INTEGER VALUES(I); END LOOP; END; 已用时间: 00: 00: 03.00
--4,以中数据量测试BINARY_INTEGER类型的INSERT DECLARE V_UPPER BINARY_INTEGER; BEGIN V_UPPER:=100000; FOR I IN 1..V_UPPER LOOP INSERT INTO T_BINARY_INTEGER VALUES(I); END LOOP; END; 已用时间: 00: 00: 03.08
--5,以中数据量测试BINARY_FLOAT类型的INSERT DECLARE V_UPPER BINARY_FLOAT; BEGIN V_UPPER:=100000; FOR I IN 1..V_UPPER LOOP INSERT INTO T_BINARY_FLOAT VALUES(I); END LOOP; END; 已用时间: 00: 00: 03.27
继续昨天的基于不同数据类型PLS_INTEGER,NUMBER,INTEGER,BINARY_INTEGER,BINARY_FLOAT的性能测试 1,修正如下PLSQL块,因为报错ORA-04030,内存分配不足,原代码是1亿条提交,现改为1000000提交试下; 分成10次提交,用绑定变量方式运行,此PLSQL块运行10次,看是否还会报ORA-04030错误 --1,以大数据量测试NUMBER类型的INSERT --因为一条条插入太慢,采用1万条一提交 --1万条一提交仍是INSERT太慢,采用FORALL试下速度如下 DECLARE V_LOWER NUMBER;--下界 V_UPPER NUMBER; TYPE TYP_TAB_UPPER IS TABLE OF NUMBER index by BINARY_INTEGER; TYP_TAB_UPPER_1 TYP_TAB_UPPER;
BEGIN V_LOWER:=1; V_UPPER:=V_LOWER+&V*10000000-1;--上界,上界依赖于下界,二者相差1000000条记录 for i in V_LOWER..V_UPPER loop TYP_TAB_UPPER_1(I):=I; end loop;
FORALL I IN V_LOWER..V_UPPER INSERT INTO T_NUMBER VALUES(TYP_TAB_UPPER_1(I)); COMMIT; --END LOOP; END; 已用时间: 00: 00: 17.34
--上述代码绑定变量总出错,整体不好排错,故只单独把出错的绑定变量拿出来 --经分析,是因为;写成;了,所以一定要小心 SET SERVEROUTPUT ON DECLARE V_LOWER NUMBER; V_UPPER NUMBER; BEGIN V_LOWER:=1; V_UPPER:=V_LOWER+&I*100; DBMS_OUTPUT.PUT_LINE(V_LOWER||'__'||V_UPPER); END;
--用普通的FOR LOOP提交1千万看下性能 09:39:42 SQL> DECLARE 09:39:44 2 BEGIN 09:39:44 3 FOR I IN 1..10000000 LOOP 09:39:44 4 INSERT INTO T_NUMBER VALUES(I); 09:39:44 5 END LOOP; 09:39:44 6 END; 09:39:45 7 /
PL/SQL 过程已成功完成。
已用时间: 00: 05: 39.37
--小结 1,FORALL运行INSERT 1千万用时17秒 FOR LOOP运行INSERT 1千万用时5分钟 2,二者差距相当大,20倍之差,所以大数据量操作一定要用FORALL 3,FORALL的语句如何让它更快,要反思的地方
--2,以大数据量测试INTEGER类型的INSERT DECLARE V_LOWER INTEGER;--下界 V_UPPER INTEGER; TYPE TYP_TAB_UPPER IS TABLE OF INTEGER index by BINARY_INTEGER; TYP_TAB_UPPER_1 TYP_TAB_UPPER;
BEGIN V_LOWER:=1; V_UPPER:=V_LOWER+&V*10000000-1;--上界,上界依赖于下界,二者相差1000000条记录 for i in V_LOWER..V_UPPER loop TYP_TAB_UPPER_1(I):=I; end loop;
FORALL I IN V_LOWER..V_UPPER INSERT INTO T_NUMBER VALUES(TYP_TAB_UPPER_1(I)); COMMIT; --END LOOP; END; 已用时间: 00: 00: 22.3
--3,以大数据量测试PLS_INTEGER类型的INSERT DECLARE V_LOWER PLS_INTEGER;--下界 V_UPPER PLS_INTEGER; TYPE TYP_TAB_UPPER IS TABLE OF PLS_INTEGER index by BINARY_INTEGER; TYP_TAB_UPPER_1 TYP_TAB_UPPER;
BEGIN V_LOWER:=1; V_UPPER:=V_LOWER+&V*10000000-1;--上界,上界依赖于下界,二者相差1000000条记录 for i in V_LOWER..V_UPPER loop TYP_TAB_UPPER_1(I):=I; end loop;
FORALL I IN V_LOWER..V_UPPER INSERT INTO T_NUMBER VALUES(TYP_TAB_UPPER_1(I)); COMMIT; --END LOOP; END; 已用时间: 00: 00: 16.93
--4,以大数据量测试BINARY_INTEGER类型的INSERT DECLARE V_LOWER BINARY_INTEGER;--下界 V_UPPER BINARY_INTEGER; TYPE TYP_TAB_UPPER IS TABLE OF BINARY_INTEGER index by BINARY_INTEGER; TYP_TAB_UPPER_1 TYP_TAB_UPPER;
BEGIN V_LOWER:=1; V_UPPER:=V_LOWER+&V*10000000-1;--上界,上界依赖于下界,二者相差1000000条记录 for i in V_LOWER..V_UPPER loop TYP_TAB_UPPER_1(I):=I; end loop;
FORALL I IN V_LOWER..V_UPPER INSERT INTO T_NUMBER VALUES(TYP_TAB_UPPER_1(I)); COMMIT; --END LOOP; END; 已用时间: 00: 00: 21.6
--5,以大数据量测试BINARY_FLOAT类型的INSERT DECLARE V_LOWER BINARY_FLOAT;--下界 V_UPPER BINARY_FLOAT; TYPE TYP_TAB_UPPER IS TABLE OF BINARY_FLOAT index by BINARY_INTEGER; TYP_TAB_UPPER_1 TYP_TAB_UPPER;
BEGIN V_LOWER:=1; V_UPPER:=V_LOWER+&V*10000000-1;--上界,上界依赖于下界,二者相差1000000条记录 for i in V_LOWER..V_UPPER loop TYP_TAB_UPPER_1(I):=I; end loop;
FORALL I IN V_LOWER..V_UPPER INSERT INTO T_NUMBER VALUES(TYP_TAB_UPPER_1(I)); COMMIT; --END LOOP; END; 已用时间: 00: 00: 21.35