扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
你好!
成都创新互联坚持“要么做到,要么别承诺”的工作理念,服务领域包括:网站建设、成都网站设计、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的龙湾网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!
一次折腾几千万的话,
那么设置一下,
有
20W了,
就自动提交一下。
set
autocommit
on;
set
autocommit
200000;
然后,假如你的目标数据库,
是归档的话,
可以
INSERT
/*+
append
*/
INTO
目标表
nologging
SELECT
*
FROM
源表@DBLINK;
commit;
set
autocommit
off;
假如你的
目标表
上面,
有
索引的话,
建议先删除
索引。
等
上面的
INSERT
语句执行完毕后,
再重建索引。
仅代表个人观点,不喜勿喷,谢谢。
显式提交和隐式提交
显式提交,比如出现commit,这类的就是显式提交。
隐式提交是不用写commit的提交,比如alter语句的提交。
两种方式实现oracle批量提交
方式一:利用 fetch .. bulk collect into .. limit limitnumber;--limitnumber批量提交条数
declare Cursor dataCursors
is
/*定义游标*/
;
type dataCursor is table of tablename%rowtype;
dataCursorP dataCursor;
begin
open dataCursors;
while (true) loop
fetch dataCursors bulk collect into dataCursorP limit 50;
forall i in 1 .. dataCursorP.count
insert into tablename values dataCursorP(i);
commit;
exit when dataCursors%notfound;
end loop;
close dataCursors;
end;
方式二:自己实现批量提交功能
实现原理:定义一个number类型的记录数,游标循环过程中记录数自增1,利用mod判断如果是否整除,整除就提交。
declare executenum:=0;
declare Cursor dataCursors
is
/*定义游标*/
;
dataCursor dataCursors%rowtype;
begin
for dataCursor in dataCursors
loop
executenum:=executenum+1;
/*update,insert or delete 等操作 */
if mod(executenum,50)=0 --这里设置50条一提交
then commit;
end if;
end loop;
commit;--最后提交一次,因为有可能最后不是50的整数
end;
--executenum还可以记录操作的条数,
QL conn roger/roger
Connected.
SQL create
cluster t_cluster(id number(2)) ;
Cluster created.
SQL create
table t_0610
2 (id number(2)
primary key,
3
name varchar2(13))
4 cluster t_cluster(id);
Table
created.
SQL create
index t_cluster_idx
on cluster t_cluster;
Index
created.
SQL
SQL insert
into t_0610 values(1,'baidu');
1 row created.
SQL insert
into t_0610 values(2,'google');
1 row created.
SQL insert
into t_0610 values(8,'roger');
1 row created.
SQL commit;
重新启动时,系统先REDO,然后对未提交的UNDO,数据在更新前的状态
这个commit应该是本机的,和dblink没什么关系,而且就算你找到的dblink的那个session那么也不行,以为这个session在dblink的操作完成后已经关闭了。
个人感觉不要这么远程insert,最好是调用一个那个数据库上的过程去insert这样的话,在那个过程中commit肯定是没有问题的。
如果必须要这么写,那么可以加入一条insert和一条delete
就是上面是正常insert的语句。
下面有一条delete(这条删除一个绝对不可能出现的一条试试)
按照你的说法,第二个事务提交时,第一个事务才能commit。可是这样会出现问题,因为如果你大量提交,那么数据库会因此夯住的,所以你看看第一个办法行不行,我觉得第一个办法还靠谱点。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流