表T1、T2结构完全一样。
T1的数据除了主键ID外都没值,ID和T2的ID是一样的,目标是把T2的数据导入到T1对应的数据行中
各有200K行数据,求 一最优SQL
谢谢

解决方案 »

  1.   

    试一下如下的步骤:(1) 可以先删除表T1(drop table t1)
    (2) 创建表并插入数据(create table t1 as select * from t2)这样或许执行效率会高一些.如此做的原因:因为你的表T1与T2结构是一样的,并且T1表中的ID又与表T2中的ID是一样的,这样,就可以直接用T2中的数据取代表T1中的数据.
      

  2.   

    insert into /*+ append*/ t1 select * from t2 where t1.id = t2.id;
      

  3.   

    先用个条件删除T1中的非空间字段,然后再用着个反条件从T2中选择出来,再插入到T1
    但是这个方法不太好,如果从T2中选出来的东西大于你的内存就麻烦了,而且如果数据多,速度也成问题DELETE FROM T1 WHERE SPACE=NULL
    INSERT INTO T2 (select * from T9 WHERE SPACE!= NULL)
      

  4.   

    DELETE FROM T1 WHERE SPACE=NULL 
    INSERT INTO T2 (select * from T1 WHERE SPACE!= NULL)
      

  5.   

    参见:http://topic.csdn.net/u/20080307/17/cbe75072-205a-4083-b17c-cd60a753d453.html1、create table t NOLOGGING as select * from
    2、或者使用Nologging建表以后使用下列语句插入    insert /*+ append */ into select from
    这就是oracle提供的对于大数据量导入的解决方案,如果你尝试比oracle聪明,那我敢保证你会撞墙。两种做法都不生成redo和undo日志。如果你不清楚这意味着什么,参见:expert one on one oracle: chapter 5
      

  6.   

    相对与delete操作来讲,Insert日志所造成的影响是比较小的,
    关键是如何快速的将数据检索出来并插入到新表中。
    建议楼主可以尝试一下方式:
    1.将这20W数据进行分段,每段数据条数基本一致(如:1W条一段)
    2.用查询语句查询出这20段的每段的第一条数据的rowid;
    3.删除目的表索引,禁用目的表触发器
    4.做成批处理,根据rowid将数据取出,分段插入到新表中,每段完毕后commit。