在Interval Partitioned表中更新5亿行的列值

时间:2014-10-16 20:59:36

标签: sql database oracle11g

我们有一个包含10亿行的表。此表日期分区。在子分区中,我们需要将符合条件的5亿行的日期更新为新值。这肯定会影响新分区或其他东西的创建,因为该表在同一日期被分区。谁能指点我最好的方法呢?

提前致谢!

3 个答案:

答案 0 :(得分:1)

如果要更新分区键并且源行位于单个(子)分区中,那么合理的方法是:

  1. 为更新的行创建临时表。如果可能,请立即执行更新

    CREATE TABLE updated_rows
    AS
    SELECT add_months(partition_key, 1), other_columns...
      FROM original_table PARITION (xxx)
     WHERE ...;
    
  2. 删除原始(子)分区

    ALTER TABLE original_table DROP PARTITION xxx;
    
  3. 重新插入更新后的行

    INSERT /*+append*/ INTO original_table
    SELECT * FROM updated_rows;
    
  4. 如果您对500M行有CTAS或INSERT INTO SELECT问题,请考虑对临时表进行分区并批量移动数据。

答案 1 :(得分:0)

嗯......如果你有足够的空间,我会用好的更新行创建源表的“副本”,然后检查结果并在其后删除源表,最后将“copy”重命名为来源。是的,这有一个很长的执行时间,但这可能是一种无痛的方式,当然需要并行提示。

答案 2 :(得分:0)

您可以考虑添加新列(标记)'更新'通过fedault将值NULL(或0,我预先为NULL)添加到您的表中,并使用您需要更新的日期批评,您可以按照Kombajn描述的相同方式逐组更新数据,数据更新后,您可以影响值1到标记'更新'到您的数据组。

例如,让我们从制作数据组开始,让我们考虑组的标准是年份。所以我们开始逐年处理数据。

  1. 创建第1年临时表:
  2. CREATE TABLE updated_rows AS SELECT columns... FROM original_table PARITION (2001) WHERE YEAR = 2001 ...;

    2.Drop original(sub)partition

    ALTER TABLE original_table DROP PARTITION 2001;

    3.重新插入更新的行

    INSERT /*+append*/ INTO original_table(columns....,updated) SELECT columns...,1 FROM updated_rows;

    希望这可以帮助您逐步处理数据,以防止等待表的所有数据一次更新。您可以考虑循环多年的游标。