想从A库导数据到B库中,有可能每次提交数据行数过亿,用dblink来做insert into select有什么办法让oracle不打开事务吗?或者不占用undo表空间就行。

解决方案 »

  1.   


    SQL> create table t as
      2  select object_name from all_objects
      3  where 1=0;
    --查看使用的undo块 
    SQL> select used_ublk
      2  from v$transaction
      3  where addr=
      4  (select taddr
      5  from v$session
      6  where sid=(select sid from v$mystat where rownum=1)); USED_UBLK
    ------------
    SQL> insert into t(object_name)
      2  select object_name from all_objects
      3  where 1=1;
    47750 rows inserted
    --添加数据后,生成了小量的undo块
    SQL> select used_ublk
      2  from v$transaction
      3  where addr=
      4  (select taddr
      5  from v$session
      6  where sid=(select sid from v$mystat where rownum=1));
     USED_UBLK
    ----------
           389
    --
    --update将会生成大量的undo块,
    SQL> update t set object_name=lower(object_name);
    47750 rows updated
    SQL> select used_ublk
      2  from v$transaction
      3  where addr=
      4  (select taddr
      5  from v$session
      6  where sid=(select sid from v$mystat where rownum=1));
     USED_UBLK
    ----------
           779
    --
    insert /*+ append */ into select 生成更少量的undo;
    在使用了append选项以后,insert数据会直接加到表的最后面,
    而不会在表的空闲块中插入数据。
    使用append会增加数据插入的速度。
    /*+APPEND*/的作用是在表的高水位上分配空间,不再使用表的extent中的空余空间
    append 属于direct insert,归档模式下append+table nologging会大量减少日志,
    非归档模式append会大量减少日志,append方式插入只会产生很少的undo,
    不去寻找 freelist 中的free block , 直接在table HWM 上面加入数据。
    注意:append+nologging增加的数据如果数据增加完成后不备份,
    那么如果数据库cash则这部分数据是恢复不了的。
      

  2.   

    我想从A库向B库导入数据,表1数据量3.8G,我的SQL:insert into 新表1
    SELECT * from 表1@db_link用了几个小时,undo涨到了6G多现在有张37G的表,用EXP导出就报错,所以也想试试用 insert into select来导我是否应该这样写:
     insert /* APPEND */ into 新表2 select * from 表2
      

  3.   

    你可以使用TTS呀。如果你并不是单独占一个tablespace的话,可以先做partition exchange之后再tts.
      

  4.   

    我现在用的
    insert   /*   APPEND   */   into   新表2   select   *   from   表2 感觉速度也还可以,也没有占用UNDO,我看到源表中有extent有什么办法可以分区来insert into select 吗?