RT,我们要写一个存储过程,每天都要从源系统读入数据,但是有一个表挺大的,130多万条数据,虽然建立了分区,可以truncate,但是插入数据的时候   我用的是insert A select ... from B(select的字段中有一些计算处理的),这样就很慢了,请问有什么方法解决这个办法吗?

解决方案 »

  1.   

    如果使用sql语句来解决这个问题的话,应该说insert into tablename select * from B是最快的方法了.一般来说几千万条数据,1小时内应该能处理完.
    如果上面的方法还是解决满足不了要求的话,那么可以尝试一下别的方法,比如使用Pro*C编写一个blk insert的程序,类似于SqlServer/Sybase的BCP的程序,应该可以把时间缩减到10分钟之内
      

  2.   


    --可以考虑用hint
    --使用批量直接路径插入(归档模式使用nologging)可以减少undo及redo生成量
    insert /*+ append */ into A nologging select * from b;
      

  3.   


    alter table tb nologginginsert /*+ append*/ into tb select * from tb alter table tb logging
      

  4.   


    谢谢,那么加上了*+ append和nologging有什么弊端吗?
      

  5.   

    这样不会产生 redo 日志,因此会有以下几点影响:
    在插入过程中如果数据库宕机,将无法保证数据库的一致性;
    在数据库还原时无法通过归档日志恢复这样插入的数据;
    使用 Data Guard 等依赖归档日志的数据库功能时,oracle 将无法处理使用此方法插入的数据。
      

  6.   


    -- 说的很好,不过:这种方法只能用在非Data Guard环境下!
    -- 5楼也说的很好!