有没有办法加速这段代码?
FOR j IN 1..max
LOOP
INSERT INTO myTable VALUES(DBMS_RANDOM.VALUE(1, 500), DBMS_RANDOM.VALUE(1, 500));
END LOOP;
循环将至少发生一百万次,所以一百万次插入。我知道FORALL,但那是为了已经存在的数据集合..对我来说真的没什么用。所以我想知道是否有比经典循环更好的方法,或者至少我可以做的其他一些改进(比如在我创建表时添加/删除一些选项),任何能够让它运行得更快的东西。
提前致谢!
答案 0 :(得分:10)
您可能希望尝试使用单个insert语句,而不是执行一百万次语句:
insert into myTable
select
dbms_random.value(1, 500),
dbms_random.value(1, 500)
from
dual
connect by
level <= 1*1000*1000;
旁注:您是否测量了执行dbms_random
所花费的时间以及实际插入值的时间?
答案 1 :(得分:5)
在单个事务中插入的一百万行将占用UNDO表空间中的大量空间。更好的选择IMO是使用一些中间提交来减少事务的跨度。因此,在@ ReneNyffenegger的答案的基础上,我建议如下:
DECLARE
nRows_inserted NUMBER := 0;
BEGIN
FOR i IN 1..1000 LOOP
INSERT INTO MY_TABLE
SELECT DBMS_RANDOM.VALUE(1, 500),
DBMS_RANDOM.VALUE(1, 500)
FROM DUAL
CONNECT BY LEVEL <= 1000;
nRows_inserted := nRows_inserted + SQL%ROWCOUNT;
COMMIT;
END LOOP;
DBMS_OUTPUT.PUT_LINE(nRows_inserted || ' rows inserted into MY_TABLE');
END;
分享并享受。