试一下如下的步骤:(1) 可以先删除表T1(drop table t1) (2) 创建表并插入数据(create table t1 as select * from t2)这样或许执行效率会高一些.如此做的原因:因为你的表T1与T2结构是一样的,并且T1表中的ID又与表T2中的ID是一样的,这样,就可以直接用T2中的数据取代表T1中的数据.
insert into /*+ append*/ t1 select * from t2 where t1.id = t2.id;
先用个条件删除T1中的非空间字段,然后再用着个反条件从T2中选择出来,再插入到T1 但是这个方法不太好,如果从T2中选出来的东西大于你的内存就麻烦了,而且如果数据多,速度也成问题DELETE FROM T1 WHERE SPACE=NULL INSERT INTO T2 (select * from T9 WHERE SPACE!= NULL)
DELETE FROM T1 WHERE SPACE=NULL INSERT INTO T2 (select * from T1 WHERE SPACE!= NULL)
参见: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
(2) 创建表并插入数据(create table t1 as select * from t2)这样或许执行效率会高一些.如此做的原因:因为你的表T1与T2结构是一样的,并且T1表中的ID又与表T2中的ID是一样的,这样,就可以直接用T2中的数据取代表T1中的数据.
但是这个方法不太好,如果从T2中选出来的东西大于你的内存就麻烦了,而且如果数据多,速度也成问题DELETE FROM T1 WHERE SPACE=NULL
INSERT INTO T2 (select * from T9 WHERE SPACE!= NULL)
INSERT INTO T2 (select * from T1 WHERE SPACE!= NULL)
2、或者使用Nologging建表以后使用下列语句插入 insert /*+ append */ into select from
这就是oracle提供的对于大数据量导入的解决方案,如果你尝试比oracle聪明,那我敢保证你会撞墙。两种做法都不生成redo和undo日志。如果你不清楚这意味着什么,参见:expert one on one oracle: chapter 5
关键是如何快速的将数据检索出来并插入到新表中。
建议楼主可以尝试一下方式:
1.将这20W数据进行分段,每段数据条数基本一致(如:1W条一段)
2.用查询语句查询出这20段的每段的第一条数据的rowid;
3.删除目的表索引,禁用目的表触发器
4.做成批处理,根据rowid将数据取出,分段插入到新表中,每段完毕后commit。