在大型更新期间处理Oracle ARCHIVELOG

在大型更新期间处理Oracle ARCHIVELOG,oracle,sql-update,oracle11gr2,Oracle,Sql Update,Oracle11gr2,需要使用元数据全局更新数据库中所有表的所有行中的列。假设每个表都有一列MY_META,目标大致是 update ANOTHER_TABLE set MY_META = 'HELLO' 每一张桌子 估计总行数为2e9 假设ARCHIVELOG模式处于启用状态,那么在这些更新过程中会消耗大量额外的空间 更新过程计划与业务事务同时在生产数据库中运行,不应丢失 开始时最简单的事情是临时为ARCHIVELOG文件安装大量硬件 有没有一种优雅的方法可以通过编程或调优秘密选项来实现相同的目标 由于您的澄清,

需要使用元数据全局更新数据库中所有表的所有行中的列。假设每个表都有一列MY_META,目标大致是

update ANOTHER_TABLE set MY_META = 'HELLO'
每一张桌子

估计总行数为2e9

假设ARCHIVELOG模式处于启用状态,那么在这些更新过程中会消耗大量额外的空间

更新过程计划与业务事务同时在生产数据库中运行,不应丢失

开始时最简单的事情是临时为ARCHIVELOG文件安装大量硬件


有没有一种优雅的方法可以通过编程或调优秘密选项来实现相同的目标

由于您的澄清,我理解:

对于每个表,您都有一个MY_META值,希望将该值作为初始值分配给每一行。 你不介意放下我的超链接重新创建它。 在这种情况下,我建议您删除我的_META并使用默认值重新创建它。如果您这样做,Oracle将不会用您的初始值更新每个记录,并且生成的重做量将是最小的

缺点是ALTERTABLE命令虽然速度很快,但会在处理每个表时短暂锁定它。它还将使依赖于MY_META列的包无效

以下是该方法的演练,并附有注释:

-- Set up your current state
DROP TABLE my_big_table;
CREATE TABLE my_big_table (a number, my_meta varchar2(30) not null);
INSERT INTO my_big_table (a, my_meta) SELECT rownum, 'GARBAGE' FROM dual CONNECT BY rownum <= 100000;

-- Drop the my_meta column and replace it with one having a default value
ALTER TABLE my_big_table DROP COLUMN my_meta;
ALTER TABLE my_big_table ADD my_meta  varchar2(30) default 'INITIAL_VAL_FOR_TABLE' not null;

-- Look at my table -- you will see every row has your initial value
SELECT * FROM my_big_table;

-- Update some data
update my_big_table set my_meta = 'UPDATED_VALUE' WHERE a <= 15;

-- Look at my table -- you will see every row has your initial value except the first 15.
SELECT * FROM my_big_table order by a;

一个简单的优化是添加nvlmy_meta,'XXX'!='你好。您可能认为Oracle不会在没有数据更改的情况下生成归档日志信息,但它确实会。或者,是的,上次我费心去测试它。