有什么办法可以加快以下插入速度吗?
Is there any way I can speed up the following insert(s)?
有什么方法可以加快这段代码的速度吗?
FOR j IN 1..max
LOOP
INSERT INTO myTable VALUES(DBMS_RANDOM.VALUE(1, 500), DBMS_RANDOM.VALUE(1, 500));
END LOOP;
循环至少会发生一百万次,所以插入一百万次以上。我知道 FORALL,但那是针对已经存在的数据集合……对我没有多大帮助。所以我想知道是否有比经典循环更好的方法,或者至少我可以做一些其他改进(比如 adding/removing 创建 table 时的一些选项),任何可以使这个 运行 更快。
提前致谢!
您可能想尝试使用单个插入语句而不是执行语句一百万次:
insert into myTable
select
dbms_random.value(1, 500),
dbms_random.value(1, 500)
from
dual
connect by
level <= 1*1000*1000;
附带说明:您是否测量了执行 dbms_random
所花费的时间以及 实际上 插入值所花费的时间?
在单个事务中插入的一百万行将在您的 UNDO tablespace 中用完很多 space。 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;
分享和享受。
有什么方法可以加快这段代码的速度吗?
FOR j IN 1..max
LOOP
INSERT INTO myTable VALUES(DBMS_RANDOM.VALUE(1, 500), DBMS_RANDOM.VALUE(1, 500));
END LOOP;
循环至少会发生一百万次,所以插入一百万次以上。我知道 FORALL,但那是针对已经存在的数据集合……对我没有多大帮助。所以我想知道是否有比经典循环更好的方法,或者至少我可以做一些其他改进(比如 adding/removing 创建 table 时的一些选项),任何可以使这个 运行 更快。
提前致谢!
您可能想尝试使用单个插入语句而不是执行语句一百万次:
insert into myTable
select
dbms_random.value(1, 500),
dbms_random.value(1, 500)
from
dual
connect by
level <= 1*1000*1000;
附带说明:您是否测量了执行 dbms_random
所花费的时间以及 实际上 插入值所花费的时间?
在单个事务中插入的一百万行将在您的 UNDO tablespace 中用完很多 space。 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;
分享和享受。