Oracle一次插入1000行

Oracle一次插入1000行,oracle,Oracle,我想使用oracle一次插入1000行 例如: INSERT INTO MSG(AUTHOR) SELECT AUTHOR FROM oldDB.MSGLOG 这个插入需要很长时间,但是如果我用ROWNUM来限制它,那么这是否真的能提高性能就相当值得怀疑了,特别是考虑到SELECT语句的简单性。必须对author上的表或索引进行完整扫描。如果扫描速度很慢,那么最好是诊断潜在问题,而不是试图解决它(例如,可能oldDB.MsgLog在高水位线以下有许多空块,这迫使全表扫描读取的块比严格需要的要

我想使用oracle一次插入1000行

例如:

INSERT INTO MSG(AUTHOR) 
SELECT AUTHOR FROM oldDB.MSGLOG

这个插入需要很长时间,但是如果我用ROWNUM来限制它,那么这是否真的能提高性能就相当值得怀疑了,特别是考虑到
SELECT
语句的简单性。必须对
author
上的表或索引进行完整扫描。如果扫描速度很慢,那么最好是诊断潜在问题,而不是试图解决它(例如,可能
oldDB.MsgLog
在高水位线以下有许多空块,这迫使全表扫描读取的块比严格需要的要多得多)

但是,如果您真的想编写更详细、效率更低的PL/SQL来完成任务,您当然可以

DECLARE
  TYPE tbl_authors IS TABLE OF msg.author%TYPE;
  l_authors tbl_authors;

  CURSOR author_cursor 
      IS SELECT author
           FROM oldDB.MsgLog;
BEGIN
  OPEN author_cursor;
  LOOP
    FETCH author_cursor
     BULK COLLECT INTO l_authors
    LIMIT 1000;

    EXIT WHEN l_authors.count = 0;

    FORALL i IN 1..l_authors.count
      INSERT INTO msg( author )
        VALUES( l_authors(i) );
  END LOOP;
END;

我的select语句更复杂,我只是简化了。thanks@SeanKeane-如果PL/SQL方法更快,则强烈暗示
SELECT
语句的查询计划不正确。如果查询计划不正确,则强烈暗示基础表上的统计信息不正确。如果统计数据不正确,修复基础统计数据比围绕问题编码更合适,因为这将不可避免地影响许多不同的查询。一次完成(不知道关于您的环境的任何信息,但基于上述内容)尝试从oldDB.msglog插入/*+append*/或创建表msg作为select author。