INSERT INTO tab1
SELECT * FROM tab2;
速度相当慢,甚至导致死机,以前好象看过Oracle大数据量插入时要用游标,每插入100条左右则commit,是不是只能这样?请给点代码。
15 个解决方案
#1
假如tab1表中的没有数据的话
考虑这个思路:
DROP TABLE TAB1;
CREATE TABLE TAB1 AS SELECT * FROM TAB2;
然后在创建索引
第二中方法:采用HINT
考虑这个思路:
DROP TABLE TAB1;
CREATE TABLE TAB1 AS SELECT * FROM TAB2;
然后在创建索引
第二中方法:采用HINT
#2
INSERT /*+Append*/ INTO tab1
SELECT * FROM tab2;
SELECT * FROM tab2;
#3
只能用insert into tb(col1,col2....) values('aaa','bbb'.....)
當然這個語句您要在Excel 裡讓它自動生成
當然這個語句您要在Excel 裡讓它自動生成
#4
INSERT INTO tab1
SELECT * FROM tab2;
用row_id来计算,每100条commit一次。
SELECT * FROM tab2;
用row_id来计算,每100条commit一次。
#5
100条提交一次还不如等数据全部插入完再提交。另外利用游标与直接insert ... select 一样需要全表扫描,所以建议直接使用insert ... select ... 形式,关键在于是否写日志及使用append提示减少数据操作的时间。建议方案是先修改表为不写日志:
sql>alter table table_name NOLOGGING;
然后采用JaneHello()提出的那种形式完成操作。
插入完数据后,再修改表写日志:
sql>alter table table_name LOGGING;
这里的区别就在于如果插入数据的同时又写日志,尤其是大数据量的insert操作,需要耗费较长的时间。
sql>alter table table_name NOLOGGING;
然后采用JaneHello()提出的那种形式完成操作。
插入完数据后,再修改表写日志:
sql>alter table table_name LOGGING;
这里的区别就在于如果插入数据的同时又写日志,尤其是大数据量的insert操作,需要耗费较长的时间。
#6
(1)给当前的两个表分别改名
alter table tab1 rename to tab11;
alter table tab2 rename to tab1;
(2)导出改名前的tab2
exp user/pwd@... file=... log=... tables=(tab1)
(3)把名字改回来
alter table tab1 rename to tab2;
alter table tab11 rename to tab1;
(4)导入数据
imp user/pwd@... file=... log=... fromuser=user touser=user tables=(tab1)
alter table tab1 rename to tab11;
alter table tab2 rename to tab1;
(2)导出改名前的tab2
exp user/pwd@... file=... log=... tables=(tab1)
(3)把名字改回来
alter table tab1 rename to tab2;
alter table tab11 rename to tab1;
(4)导入数据
imp user/pwd@... file=... log=... fromuser=user touser=user tables=(tab1)
#7
懒猫儿决定把插入大量数据交给exp和imp去做
*_*
*_*
#8
刚好培训过,有解决方案
#9
这次培训是请Oracle公司顾问讲的,教材是给神码的专编教材,主要以大型软件如电信烟草、税务等案例讲的
需要的话,可以用CSDN发送消息
需要的话,可以用CSDN发送消息
#10
我觉得三种方法可行吧
1 INSERT /*+Append*/ INTO tab1
SELECT * FROM tab2;
这是直接插入不需处理回滚等一些事务....
2 把原表delete 掉 然后create as
3 因为你是oracle 所以在进行数据处理时最好使用批动,建议使用动态批处理方式,只要你的内存够大
1 INSERT /*+Append*/ INTO tab1
SELECT * FROM tab2;
这是直接插入不需处理回滚等一些事务....
2 把原表delete 掉 然后create as
3 因为你是oracle 所以在进行数据处理时最好使用批动,建议使用动态批处理方式,只要你的内存够大
#11
可以使用Hint,即Append、nologging,再加上并行操作应该可以,
#12
我觉得xiaoxiao1984(笨猫儿) 的提议不错
#13
学习中!
#14
如果从别的类型的数据库(比如sqlserver,db2)该如何做呢!!
#15
这个不晓得 有带进一步探讨
#1
假如tab1表中的没有数据的话
考虑这个思路:
DROP TABLE TAB1;
CREATE TABLE TAB1 AS SELECT * FROM TAB2;
然后在创建索引
第二中方法:采用HINT
考虑这个思路:
DROP TABLE TAB1;
CREATE TABLE TAB1 AS SELECT * FROM TAB2;
然后在创建索引
第二中方法:采用HINT
#2
INSERT /*+Append*/ INTO tab1
SELECT * FROM tab2;
SELECT * FROM tab2;
#3
只能用insert into tb(col1,col2....) values('aaa','bbb'.....)
當然這個語句您要在Excel 裡讓它自動生成
當然這個語句您要在Excel 裡讓它自動生成
#4
INSERT INTO tab1
SELECT * FROM tab2;
用row_id来计算,每100条commit一次。
SELECT * FROM tab2;
用row_id来计算,每100条commit一次。
#5
100条提交一次还不如等数据全部插入完再提交。另外利用游标与直接insert ... select 一样需要全表扫描,所以建议直接使用insert ... select ... 形式,关键在于是否写日志及使用append提示减少数据操作的时间。建议方案是先修改表为不写日志:
sql>alter table table_name NOLOGGING;
然后采用JaneHello()提出的那种形式完成操作。
插入完数据后,再修改表写日志:
sql>alter table table_name LOGGING;
这里的区别就在于如果插入数据的同时又写日志,尤其是大数据量的insert操作,需要耗费较长的时间。
sql>alter table table_name NOLOGGING;
然后采用JaneHello()提出的那种形式完成操作。
插入完数据后,再修改表写日志:
sql>alter table table_name LOGGING;
这里的区别就在于如果插入数据的同时又写日志,尤其是大数据量的insert操作,需要耗费较长的时间。
#6
(1)给当前的两个表分别改名
alter table tab1 rename to tab11;
alter table tab2 rename to tab1;
(2)导出改名前的tab2
exp user/pwd@... file=... log=... tables=(tab1)
(3)把名字改回来
alter table tab1 rename to tab2;
alter table tab11 rename to tab1;
(4)导入数据
imp user/pwd@... file=... log=... fromuser=user touser=user tables=(tab1)
alter table tab1 rename to tab11;
alter table tab2 rename to tab1;
(2)导出改名前的tab2
exp user/pwd@... file=... log=... tables=(tab1)
(3)把名字改回来
alter table tab1 rename to tab2;
alter table tab11 rename to tab1;
(4)导入数据
imp user/pwd@... file=... log=... fromuser=user touser=user tables=(tab1)
#7
懒猫儿决定把插入大量数据交给exp和imp去做
*_*
*_*
#8
刚好培训过,有解决方案
#9
这次培训是请Oracle公司顾问讲的,教材是给神码的专编教材,主要以大型软件如电信烟草、税务等案例讲的
需要的话,可以用CSDN发送消息
需要的话,可以用CSDN发送消息
#10
我觉得三种方法可行吧
1 INSERT /*+Append*/ INTO tab1
SELECT * FROM tab2;
这是直接插入不需处理回滚等一些事务....
2 把原表delete 掉 然后create as
3 因为你是oracle 所以在进行数据处理时最好使用批动,建议使用动态批处理方式,只要你的内存够大
1 INSERT /*+Append*/ INTO tab1
SELECT * FROM tab2;
这是直接插入不需处理回滚等一些事务....
2 把原表delete 掉 然后create as
3 因为你是oracle 所以在进行数据处理时最好使用批动,建议使用动态批处理方式,只要你的内存够大
#11
可以使用Hint,即Append、nologging,再加上并行操作应该可以,
#12
我觉得xiaoxiao1984(笨猫儿) 的提议不错
#13
学习中!
#14
如果从别的类型的数据库(比如sqlserver,db2)该如何做呢!!
#15
这个不晓得 有带进一步探讨