Oracle SQL通过游标使用和单次提交有效地插入大型数据集

Woo*_*Moo 0 sql database oracle performance oracle10g

以下SQL生成具有相同模式的两个表之间的所有匹配记录,然后继续迭代存储此结果集的游标.我在这个函数的末尾用行提交逐行插入.我的问题是如何从这种类型的查询中获得最大的性能?代码如下:

BEGIN  
DECLARE    
   CURSOR foo IS  
        SELECT * FROM tableOne to  
        WHERE EXISTS (SELECT * FROM tableTwo tt  
                       WHERE TO.FOO = TT.FOO  
                       AND TO.BAR = TT.BAR);  --THIS TAKES 5 MINUTES (66 MILLION ROWS)
     BEGIN  
           FOR nextFoo IN foo  
     LOOP  
            INSERT INTO tracker t  
               (id,foo,bar,baz)  
            VALUES(trackerSequence.nextval, nextFoo.foo,nextFoo.bar,nextFoo.baz);  
     END LOOP;   
     COMMIT;  
     END;  
END;
Run Code Online (Sandbox Code Playgroud)

此查询可能需要一个多小时,我正在尝试减少与之相关的时间成本.我将处理一般的1.4亿条记录,所以我希望这个过程花费的时间加倍.所有列都已编制索引.

版本信息:

10克10.2

Mar*_*nen 6

怎么样

INSERT INTO tracker t SELECT trackerSequence.nextVal
                            ,foo
                            ,bar
                            ,baz 
                      FROM tableOne to 
                            INNER JOIN tabletwo tt 
                         ON (to.foo = tt.foo and to.bar=tt.bar);
Run Code Online (Sandbox Code Playgroud)

我想知道这是否会更好地优化.

还要确保在插入时禁用跟踪器 - 索引.

  • @ Woot4Moo只需在select语句中包含sequnce即可为插入提供内容.没有什么比原始SQL更快,它甚至比PL/SQL批量收集或FORALL更快. (2认同)