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