如果使用sql语句来解决这个问题的话,应该说insert into tablename select * from B是最快的方法了.一般来说几千万条数据,1小时内应该能处理完. 如果上面的方法还是解决满足不了要求的话,那么可以尝试一下别的方法,比如使用Pro*C编写一个blk insert的程序,类似于SqlServer/Sybase的BCP的程序,应该可以把时间缩减到10分钟之内
--可以考虑用hint --使用批量直接路径插入(归档模式使用nologging)可以减少undo及redo生成量 insert /*+ append */ into A nologging select * from b;
alter table tb nologginginsert /*+ append*/ into tb select * from tb alter table tb logging
谢谢,那么加上了*+ append和nologging有什么弊端吗?
这样不会产生 redo 日志,因此会有以下几点影响: 在插入过程中如果数据库宕机,将无法保证数据库的一致性; 在数据库还原时无法通过归档日志恢复这样插入的数据; 使用 Data Guard 等依赖归档日志的数据库功能时,oracle 将无法处理使用此方法插入的数据。
如果上面的方法还是解决满足不了要求的话,那么可以尝试一下别的方法,比如使用Pro*C编写一个blk insert的程序,类似于SqlServer/Sybase的BCP的程序,应该可以把时间缩减到10分钟之内
--可以考虑用hint
--使用批量直接路径插入(归档模式使用nologging)可以减少undo及redo生成量
insert /*+ append */ into A nologging select * from b;
alter table tb nologginginsert /*+ append*/ into tb select * from tb alter table tb logging
谢谢,那么加上了*+ append和nologging有什么弊端吗?
在插入过程中如果数据库宕机,将无法保证数据库的一致性;
在数据库还原时无法通过归档日志恢复这样插入的数据;
使用 Data Guard 等依赖归档日志的数据库功能时,oracle 将无法处理使用此方法插入的数据。
-- 说的很好,不过:这种方法只能用在非Data Guard环境下!
-- 5楼也说的很好!