Query performance difference pl/sql forall insert and plain SQL insert

前端 未结 6 1003
小鲜肉
小鲜肉 2021-02-10 02:29

We have been using temporary table to store intermediate results in pl/sql Stored procedure. Could anyone tell if there is a performance difference between doing bulk collect in

6条回答
  •  佛祖请我去吃肉
    2021-02-10 03:14

    Some experimental data for your problem (Oracle 9.2)

    bulk collect

    DECLARE 
      TYPE t_number_table IS TABLE OF NUMBER;
      v_tab t_number_table;
    BEGIN
      SELECT ROWNUM
      BULK COLLECT INTO v_tab
      FROM dual
      CONNECT BY LEVEL < 100000;
    
      FORALL i IN 1..v_tab.COUNT
        INSERT INTO test VALUES (v_tab(i));
    END;
    /
    -- 2.6 sec
    

    insert

    -- test table 
    CREATE global TEMPORARY TABLE test (id number)
    ON COMMIT preserve ROWS;
    
    BEGIN
      INSERT INTO test
      SELECT ROWNUM FROM dual
      CONNECT BY LEVEL < 100000;
    END;
    /
    -- 1.4 sec
    

    direct path insert http://download.oracle.com/docs/cd/B10500_01/server.920/a96524/c21dlins.htm

    BEGIN
      INSERT /*+ append */ INTO test
      SELECT ROWNUM FROM dual
      CONNECT BY LEVEL < 100000;
    END;
    /
    -- 1.2 sec
    

提交回复
热议问题