oracle要update给表TABLE的字段A加前缀,由于该表的数据量极大,大概有八千万条数据,用普通的语句执行非常慢。
UPDATE TABLE SET A='FTP'||A,
可以怎样优化吗。
写一个loop循环就可以
declare
i number;
j number;
begin
i := 1;
j := 0;
select count(1) into j from 表名 where A not like '%FTP%' ;
loop
exit when i > j;
update 表名 set A='FTP'||A
where A not like '%FTP%' and rownum < (i + 1000);
i := i + 1000;
commit;
end loop;
end;
新建一张空表,表名设置为期望中的表,创建好后,将原来的表的数据copy到新表中,这种方式执行要多久?
1、这个表当初应该建立成分区表,这样按分区更新即不会造成全表锁,也会缩短更新的时间
2、如果业务频繁,则需要按一定规则如时间段将数据分割,一次更新部分数据(前提是应用先行修改更新,不然新的数据不断产生,更新连绵不绝)
3、根据具体需求和情况,也可以考虑新增一个字段B,其默认值设置为:FTP,提取字段的时间将A、B字段联合即可:B || A as A,不过也会进行全表锁,不过估计时间上应该远低于直接更新字段A,但所有应用在提取字段时需要进行相应修改,特殊情况才会考虑该方案
4、建立一个计算字段C,其值为:'FTP'||A,不过同样需要修改相关应用,提取A字段全部修改为提取C
具体限制和具体需求,考虑具体方案,以上只是抛砖引玉而已…………