1000万条数据如何insert

时间:2021-07-07 23:31:23
从服务器A的表table1中拿数据,然后删除服务器B的表table2中的数据,再将取到的数据insert到服务器B的表table2中

语句我知道怎么写,关键是table1中有1000多万条数据,怎么插入到table2中?

32 个解决方案

#1


通過DBlink直接INSERT

#2


楼主可以换个思路,为什么每次都要删除table2中的数据呢,更新里面的数据不行吗?
两台服务器需要dblink了
可以在table1表中设置触发器,当有更新的时候把数据更新到table2中

#3


直接update速度会快些吗?我先truncate然后insert时,速度很慢,还可能死机。
引用 2 楼 liuyyuns 的回复:
楼主可以换个思路,为什么每次都要删除table2中的数据呢,更新里面的数据不行吗?
两台服务器需要dblink了
可以在table1表中设置触发器,当有更新的时候把数据更新到table2中

#4


exp/imp

#5


exp/imp
rename A to B

#6


可以尝试下楼上两位的方法

#7



alter table B nologging ;

insert into B select * from A@dblink where ...;--如果是增量,可以在条件里限制。
commit;

#8


导入导出是可以的,但是太麻烦了,直接进行同步不行嘛?
引用 6 楼 minitoy 的回复:
可以尝试下楼上两位的方法

#9


 这事手工做的话,EXP/IMP最好了
如果不是,还是用DBLINK吧

操作放在B上,建一个DBLINK -> A 就可以了
至于性能方面,好像没有具体说到环境、表的设计等其它方面,插入慢,数据量只是参考点之一。

#10


如果是内网的话dblink也可以,外网最好是exp,压缩后再imp。

#11


该有的方法楼上都已经说过了,具体要看自己怎么操作了…

#12


这么大的数据,导入导出

#13


去看看 ETL 方面的资料或许有用 方法很多的 可以考虑用别的工具 
也可以考虑在原来A上建立分区表 一部分一部分的往新B 里插入 可能一次插入太多 消耗资源太多

#14


不想导的话就只能批量插入了

#15


怎么没有人提到用sqlldr呢?

#16


就用导入导出。
 imp/exp

#17


我只会exp/imp

#18


加hint  /*+ append */

#19


引用楼主 huangqi1423 的回复:
从服务器A的表table1中拿数据,然后删除服务器B的表table2中的数据,再将取到的数据insert到服务器B的表table2中

语句我知道怎么写,关键是table1中有1000多万条数据,怎么插入到table2中?


alter table b nologging

insert /* +append */ into b select * from a@dblink;

#20


引用 19 楼 wkc168 的回复:
引用楼主 huangqi1423 的回复:
从服务器A的表table1中拿数据,然后删除服务器B的表table2中的数据,再将取到的数据insert到服务器B的表table2中

语句我知道怎么写,关键是table1中有1000多万条数据,怎么插入到table2中?


alter table b nologging

insert /* +append */ into b sel……


也可以采用exp  imp 也很好

#21


引用 19 楼 wkc168 的回复:
引用楼主 huangqi1423 的回复:
从服务器A的表table1中拿数据,然后删除服务器B的表table2中的数据,再将取到的数据insert到服务器B的表table2中

语句我知道怎么写,关键是table1中有1000多万条数据,怎么插入到table2中?


alter table b nologging

insert /* +append */ into b se……
这个方法好 直接路径插入

#22


注意回滚段

#23


引用 19 楼 wkc168 的回复:
引用楼主 huangqi1423 的回复:
从服务器A的表table1中拿数据,然后删除服务器B的表table2中的数据,再将取到的数据insert到服务器B的表table2中

语句我知道怎么写,关键是table1中有1000多万条数据,怎么插入到table2中?


alter table b nologging

insert /* +append */ into b se……

题外话,设为nologging后最好做一次备份。

#24


insert /* +append */ 
insert /* +paralle*/
insert bulk into 
nolog

#25


data pump导出,作为外部表加载

#26


SQL> copy from user/pass@tnsname -
> append table_nameb(name1,name2) -
> using select * from tabl_namea

copy from 这个功能据说要去掉了,被exp/imp 取代。不过还是挺好用的,
我导过2、3百万的数据用了 不到十分钟吧。

#27


你的数据库要是归档的话,insert会让 闪回空间爆掉,那可是1000w呀,连删除带插入 多少日志,你想想。
最好是导出导入  ,要是想insert就得先把归档关掉 ,你考虑吧  导入导出 是没日志的  

#28


直接用ETL工具啊 快多了

#29


我以前做大数据插入(大约5000w):
备份数据,关日志、del索引,插,建索引,检查数据,开日志,ok

#30


直接用DBLINK Insert预计会有问题D.
小心回滚段和日志文件.建议用exp/imp.

#31


引用 15 楼 lanyu1986 的回复:
怎么没有人提到用sqlldr呢?

这个顶一下,我就是经常用这个。另外楼主的服务器A 和服务器B如果一样(里面的表索引等一系列对象)的话,可以试一下这两个命令
expdp impdp 这个速度是相当快的

#32


哇...说实话..我看不懂dblink是什么意思..刚入门的菜鸟..求高手写个事例加速了解谢谢!

#1


通過DBlink直接INSERT

#2


楼主可以换个思路,为什么每次都要删除table2中的数据呢,更新里面的数据不行吗?
两台服务器需要dblink了
可以在table1表中设置触发器,当有更新的时候把数据更新到table2中

#3


直接update速度会快些吗?我先truncate然后insert时,速度很慢,还可能死机。
引用 2 楼 liuyyuns 的回复:
楼主可以换个思路,为什么每次都要删除table2中的数据呢,更新里面的数据不行吗?
两台服务器需要dblink了
可以在table1表中设置触发器,当有更新的时候把数据更新到table2中

#4


exp/imp

#5


exp/imp
rename A to B

#6


可以尝试下楼上两位的方法

#7



alter table B nologging ;

insert into B select * from A@dblink where ...;--如果是增量,可以在条件里限制。
commit;

#8


导入导出是可以的,但是太麻烦了,直接进行同步不行嘛?
引用 6 楼 minitoy 的回复:
可以尝试下楼上两位的方法

#9


 这事手工做的话,EXP/IMP最好了
如果不是,还是用DBLINK吧

操作放在B上,建一个DBLINK -> A 就可以了
至于性能方面,好像没有具体说到环境、表的设计等其它方面,插入慢,数据量只是参考点之一。

#10


如果是内网的话dblink也可以,外网最好是exp,压缩后再imp。

#11


该有的方法楼上都已经说过了,具体要看自己怎么操作了…

#12


这么大的数据,导入导出

#13


去看看 ETL 方面的资料或许有用 方法很多的 可以考虑用别的工具 
也可以考虑在原来A上建立分区表 一部分一部分的往新B 里插入 可能一次插入太多 消耗资源太多

#14


不想导的话就只能批量插入了

#15


怎么没有人提到用sqlldr呢?

#16


就用导入导出。
 imp/exp

#17


我只会exp/imp

#18


加hint  /*+ append */

#19


引用楼主 huangqi1423 的回复:
从服务器A的表table1中拿数据,然后删除服务器B的表table2中的数据,再将取到的数据insert到服务器B的表table2中

语句我知道怎么写,关键是table1中有1000多万条数据,怎么插入到table2中?


alter table b nologging

insert /* +append */ into b select * from a@dblink;

#20


引用 19 楼 wkc168 的回复:
引用楼主 huangqi1423 的回复:
从服务器A的表table1中拿数据,然后删除服务器B的表table2中的数据,再将取到的数据insert到服务器B的表table2中

语句我知道怎么写,关键是table1中有1000多万条数据,怎么插入到table2中?


alter table b nologging

insert /* +append */ into b sel……


也可以采用exp  imp 也很好

#21


引用 19 楼 wkc168 的回复:
引用楼主 huangqi1423 的回复:
从服务器A的表table1中拿数据,然后删除服务器B的表table2中的数据,再将取到的数据insert到服务器B的表table2中

语句我知道怎么写,关键是table1中有1000多万条数据,怎么插入到table2中?


alter table b nologging

insert /* +append */ into b se……
这个方法好 直接路径插入

#22


注意回滚段

#23


引用 19 楼 wkc168 的回复:
引用楼主 huangqi1423 的回复:
从服务器A的表table1中拿数据,然后删除服务器B的表table2中的数据,再将取到的数据insert到服务器B的表table2中

语句我知道怎么写,关键是table1中有1000多万条数据,怎么插入到table2中?


alter table b nologging

insert /* +append */ into b se……

题外话,设为nologging后最好做一次备份。

#24


insert /* +append */ 
insert /* +paralle*/
insert bulk into 
nolog

#25


data pump导出,作为外部表加载

#26


SQL> copy from user/pass@tnsname -
> append table_nameb(name1,name2) -
> using select * from tabl_namea

copy from 这个功能据说要去掉了,被exp/imp 取代。不过还是挺好用的,
我导过2、3百万的数据用了 不到十分钟吧。

#27


你的数据库要是归档的话,insert会让 闪回空间爆掉,那可是1000w呀,连删除带插入 多少日志,你想想。
最好是导出导入  ,要是想insert就得先把归档关掉 ,你考虑吧  导入导出 是没日志的  

#28


直接用ETL工具啊 快多了

#29


我以前做大数据插入(大约5000w):
备份数据,关日志、del索引,插,建索引,检查数据,开日志,ok

#30


直接用DBLINK Insert预计会有问题D.
小心回滚段和日志文件.建议用exp/imp.

#31


引用 15 楼 lanyu1986 的回复:
怎么没有人提到用sqlldr呢?

这个顶一下,我就是经常用这个。另外楼主的服务器A 和服务器B如果一样(里面的表索引等一系列对象)的话,可以试一下这两个命令
expdp impdp 这个速度是相当快的

#32


哇...说实话..我看不懂dblink是什么意思..刚入门的菜鸟..求高手写个事例加速了解谢谢!