为什么要imp/exp,直接insert +select不行?

解决方案 »

  1.   

    因为数据量非常大
    如果用insert + select可能回滚段不够用。
      

  2.   

    8i的写法,其它版本没用过
    exp hrms_zsgd/hrms_zsgd  file=d:\baoxian.DMP tables=("T_INSURANCESTANDARD","T_INSURANCESTANDARDEMPLOYEEMAP");
    导出dmp文件后 然后在imp进去
      

  3.   

    exp user/pass@database file = c:\backup.dmp tables = ...
    imp user/pass@database file = c:\backup.dmp tables = ...
      

  4.   

    bcsky(皮皮) 
      我的问题是如何imp到另外一张表(另外一个表名)中。如果exp/imp实现不了,对于数据量很大的情况,还有什么比较的方式实现?
      

  5.   

    看来我没有描述清楚:A,B表结构完全相同,A表中有数据,B表中没有,现在想把A表中的数据复制一份到B表中。
    数据量很大,有没有好的办法?
      

  6.   

    bcsky(皮皮) 
      我的问题是如何imp到另外一张表(另外一个表名)中。如果exp/imp实现不了,对于数据量很大的情况,还有什么比较的方式实现?-----------------------------------------------------------------------
    关于楼上的这个问题,可以考虑direct insert的方法,具体的sql写法是
    insert /*+append*/ into B select * from A
      

  7.   

    SQL> select * from t;        ID        PID
    ---------- ----------
            20         10
            30         20
            40         30
            50         40已用时间:  00: 00: 00.30
    exp scott/tiger tables=(t) file=c:\scott.dmpimp scott/tiger tables=(t) file=c:\scott.dmp ignore=y
    SQL> select * from t;        ID        PID
    ---------- ----------
            20         10
            30         20
            40         30
            50         40
            20         10
            30         20
            40         30
            50         40已选择8行。已用时间:  00: 00: 00.30
    SQL>
      

  8.   

    在B数据库DROP TABLE TABLENAME;
    exp USER/PASS@DBLINKa tables=ABLENAME file=c:\TABLE.dmp
    imp USER/PASS@DBLINKb file=c:\table.dmp
      

  9.   

    exp/imp做不到这一点. 需要先把原表导入,再手工insert
      

  10.   

    用Exp备份的数据Imp后还是同样的表名。
      

  11.   

    [ALTER TABLE TABLE_B NOLOGGING;]
    INSERT INTO TABLE_B /*+APPEND*/ NOLOGGING SELECT * FROM TABLE_A ;
    COMMIT;
    [ALTER TABLE TABLE_B LOGGING;]
    试试看,一般1000万左右的数据我这样处理都很快的
      

  12.   

    你也可以用create table table1 as table2 然后再给table1 增加索引什么的
      

  13.   

    1. exp user/pwd@netname file=a.dmp owner=user tables=(A) log=1.log
    2. 删除B表,把A表重新命名为B表的表名
    3. imp user/pwd@netname file=a.dmp fromuser=user touser=user tables=(A) log=2.log
      

  14.   

    如果是在同一库中,为什么不用
    create table newtable as select * from old table;
      

  15.   

    TO nowait(独行天涯路) 
       我记得曾看过文章NOLOGGING是指建表时NOLOGGING,实际对表的操作仍然是有LOG的。
       
    INSERT INTO TABLE_B /*+APPEND*/ NOLOGGING SELECT * FROM TABLE_A ;
    COMMIT;
    这种方式不占用回滚段吗?
      

  16.   

    好象imp/exp做不到你所说的要求,如果两个表在如果两个表在同一个数据库中,可以使用触发器来完成实时的数据同步,但不一定是你所需要的。
      

  17.   

    用下面的语句很快:
    create table newtable
    nologging
    tablespace tablespacename
    as 
      select * from oldtablename