代码之家  ›  专栏  ›  技术社区  ›  diziaq

在大量更新期间处理Oracle ArchiveLog

  •  0
  • diziaq  · 技术社区  · 8 年前

    需要在数据库中所有表的所有行中全局更新包含元数据的列。假设每张桌子都有一列 MY_META 目标大致是

    update ANOTHER_TABLE set MY_META = 'HELLO'
    

    每一张桌子。

    估计的总行数为 2e9

    1 回复  |  直到 8 年前
        1
  •  1
  •   Matthew McPeak    8 年前

    • MY_META

    缺点是 ALTER TABLE 命令虽然速度很快,但在处理每个表时会短暂地锁定它。它还将使依赖于 米亚梅塔 列。

    下面是该方法的演练,其中包含以下注释:

    -- 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;