Oracle100w数据大表割接

【现网问题】
最近在给咪咕做视频后台管理,移动那边希望页面上,码流字段可以支持1位小数,如8.0。自己查看数据库,发现码流字段是Number整型,也就是要换类型,打算直接换成varchar2。因为自己一般建表,除了主键外键或者特殊的,其余字段设置都喜欢设置成varchar2,适应业务场景更广。当然也可以选Number(*,1),保留1位小数,不过移动那边需求,再改了就蛋疼了。

以下:表名:tb_name 字段名:col_name 现网数据量估计100w

【失败尝试1】

alter table tb_name modify (col_name nvarchar2(128));

因为现网字段有数据,所以会报错误“ORA-01439:要更改数据类型,则要修改的列必须为空”。
注意:不是所有修改字段类型,有数据就都会报这个错误,像给nvarchar2增加长度,不会影响原来的数据,肯定就不报这个错。

【失败尝试2】

--修改原字段名col_name为col_namebak
alter table tb_name rename column col_name to col_namebak;
--增加一个和原字段名同名的字段col_name
alter table tb_name add col_name varchar2(128);
--将备份col_namebak数据更新到增加的字段col_name 
update tb_name set col_name=col_namebak;
--更新完,删除备份字段col_namebak
alter table tb_name drop column col_namebak;

这样尽管不会报ORA-01439错误,但是因为现网有100w的内容,在更新完统一commit会,消耗很多时间,这样就需要分批次提交。

【成功尝试】

--待编辑cur的定义,检查sql的daemon
declare
	v_count number;
	begin
	for cur in (select t.rowid from tb_name t) loop
		update tb_name set col_name=col_namebak;
		v_count := v_count + 1;
		if v_count >= 5000 then
			commit;
		end if;
	end loop;
	commit;
end;
/

这样,更新语句会每5000次提交1次,消耗时间会缩短一半多。

【参考】
https://www.cnblogs.com/langtianya/p/6148491.html
https://blog.csdn.net/baple/article/details/43014961

posted @ 2018-03-31 20:07  李凯伦  阅读(222)  评论(0)    收藏  举报