有什么办法可以加快以下插入速度吗?

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;

分享和享受。