我们有一个大约3500万行的Oracle 11g数据库表。我们处于这样一种情况,我们必须更新一列的所有值。此列已编入索引。
我有一个可以生成更新值的脚本,可以在文本文件中填充它。
我正在寻找一个好的策略来对此表进行批量更新。我们可以承受大约10个小时的停机时间。
是不是一个好主意
人们可能遇到的陷阱是什么?
我不能胜任PL / SQL。有没有办法在PL / SQL中解决这个问题,或者在数据库本身“内部”解决这个问题?
谢谢, 帕布
答案 0 :(得分:1)
最快的方法可能是根据更新值的平面文件创建external table,然后:
create table new_table as
select o.col1, o.col2, o.col3, ..., x.value as colN
from old_table o
join extern_table x on ...;
(确保join返回old_table中的所有行。连接可能需要是外连接。)
-- drop foreign key constraints that reference old_table
alter table child1 drop constraint fk_to_old_table1;
...
drop table old_table;
rename new_table to old_table;
-- Re-create indexes and constraints on old_table
alter table old_table add constraint oldpk primary key (col1);
...
-- Re-create the dropped foreign key constraints to old_table
alter table child1 add constraint fk_to_old_table1 ...;
...