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

时间:2015-03-10 10:30:15

标签: sql oracle plsql

有没有办法加速这段代码?

FOR j IN 1..max
LOOP
  INSERT INTO myTable VALUES(DBMS_RANDOM.VALUE(1, 500), DBMS_RANDOM.VALUE(1, 500));
END LOOP;

循环将至少发生一百万次,所以一百万次插入。我知道FORALL,但那是为了已经存在的数据集合..对我来说真的没什么用。所以我想知道是否有比经典循环更好的方法,或者至少我可以做的其他一些改进(比如在我创建表时添加/删除一些选项),任何能够让它运行得更快的东西。

提前致谢!

2 个答案:

答案 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;

分享并享受。