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

浙公网安备 33010602011771号