繁体   English   中英

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

[英]Update a column value for 500 million rows in Interval Partitioned table

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

提前致谢!

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

  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; 

如果您对500M行有CTAS或INSERT INTO SELECT问题,请考虑对临时表进行分区并批量移动数据。

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

您可以考虑添加一个新列(标记)'已更新'位,通过fedault将值NULL(或0,i preffer NULL)添加到您的表中,并使用您需要更新的日期的批评,您可以更新数据组按照Kombajn描述的相同方式按组进行更新,一旦数据组更新,您可以将值1更改为标记为“已更新”的数据组。

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

  1. 创建第1年的临时表:

CREATE TABLE updated_rows AS SELECT columns... FROM original_table PARITION (2001) WHERE YEAR = 2001 ...;

2.Drop原始(子)分区

ALTER TABLE original_table DROP PARTITION 2001;

3.重新插入更新的行

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM