Oracle批量提取和FORALL插入的性能问题
我正试图尽可能快地将记录从一个表复制到另一个表 目前,我有一个简单的光标循环,类似于:Oracle批量提取和FORALL插入的性能问题,oracle,plsql,query-optimization,bulkinsert,Oracle,Plsql,Query Optimization,Bulkinsert,我正试图尽可能快地将记录从一个表复制到另一个表 目前,我有一个简单的光标循环,类似于: FOR rec IN source_cursor LOOP INSERT INTO destination (a, b) VALUES (rec.a, rec.b) END LOOP; 我想加快速度,使其达到超快,因此我尝试了一些批量操作—批量提取,然后是FORALL插入: 以下是我为批量选择/全选插入所做的准备 DECLARE TYPE t__event_rows IS TABLE OF _e
FOR rec IN source_cursor LOOP
INSERT INTO destination (a, b) VALUES (rec.a, rec.b)
END LOOP;
我想加快速度,使其达到超快,因此我尝试了一些批量操作—批量提取,然后是FORALL插入:
以下是我为批量选择/全选插入所做的准备
DECLARE
TYPE t__event_rows IS TABLE OF _event%ROWTYPE;
v__event_rows t__event_rows;
CURSOR c__events IS
SELECT * FROM _EVENT ORDER BY MESSAGE_ID;
BEGIN
OPEN c__events;
LOOP
FETCH c__events BULK COLLECT INTO v__event_rows LIMIT 10000; -- limit to 10k to avoid out of memory
EXIT WHEN c__events%NOTFOUND;
FORALL i IN 1..v__event_rows.COUNT SAVE EXCEPTIONS
INSERT INTO destinatoin
( col1, col2, a_sequence)
VALUES
( v__event_rows(i).col1, v__event_rows(i).col2, SOMESEQEUENCE.NEXTVAL );
END LOOP;
CLOSE c__events;
END;
我的问题是,到目前为止,我还没有看到任何大的性能提升。据我所知,它应该快10-100倍
我是否在这里遗漏了一个瓶颈?与简单的插入+选择相比,您的代码的唯一好处是可以保存异常,而且正如Justin指出的那样,您有一个毫无意义的顺序,通过它可以完成大量无意义的工作。无论如何,您没有任何代码来处理保存的异常
我只是将其实现为插入+选择。与简单的插入+选择相比,您的代码的唯一好处是可以保存异常,而且正如Justin指出的那样,您有一个毫无意义的顺序,通过这个顺序,它可以做大量无意义的工作。无论如何,您没有任何代码来处理保存的异常
我只是将其实现为插入+选择。在编码本身需要循环之前,您不必不必要地使用循环。在编码本身需要循环之前,您不必不必要地使用循环。对于100000行,大约需要300!即使批量插入,也需要几秒钟。您的选择中是否有订单?对100000行进行排序可能相当昂贵,而且似乎没有必要这样做。另外,您的%NOTFOUND检查需要在FORALL之后进行-否则,如果您在上一次迭代中获取的行少于10000行,您将不会插入这些行。谢谢!我会取消订单的,但我不认为它会让我相当的速度,我期待。。。我将尝试获取tkprof分析,并在稍后更新。%notfound捕捉得很好目标表中是否有触发器?另外,如果只是将数据从一个表复制到另一个表,是否可以使用SQL语句而不是PL/SQL?请注意:对于100000行,大约需要300!即使批量插入,也需要几秒钟。您的选择中是否有订单?对100000行进行排序可能相当昂贵,而且似乎没有必要这样做。另外,您的%NOTFOUND检查需要在FORALL之后进行-否则,如果您在上一次迭代中获取的行少于10000行,您将不会插入这些行。谢谢!我会取消订单的,但我不认为它会让我相当的速度,我期待。。。我将尝试获取tkprof分析,并在稍后更新。%notfound捕捉得很好目标表中是否有触发器?另外,如果您只是将数据从一个表复制到另一个表,是否可以使用SQL语句而不是PL/SQL?请注意:您可以在INSERT上使用LOG ERRORS子句来保存异常。您可以在INSERT上使用LOG ERRORS子句来保存异常。这应该是一条注释,不是答案。是的,但是代码需要一些技巧来解决更好的性能问题。是的,这就是为什么它应该是注释:这应该是注释,而不是答案。是的,但是代码需要一些技巧来解决更好的性能问题。是的,这就是为什么它应该是注释: