[英]Update a column value for 500 million rows in Interval Partitioned table
我们有一张10亿行的表。 此表是按日期分区的 。 在子分区中,我们需要将符合条件的5亿行的日期更新为新值。 这肯定会影响新分区或其他东西的创建,因为该表在同一日期被分区。 谁能指点我最好的方法呢?
提前致谢!
如果要更新分区键并且源行位于单个(子)分区中,那么合理的方法是:
为更新的行创建临时表。 如果可能,请立即执行更新
CREATE TABLE updated_rows AS SELECT add_months(partition_key, 1), other_columns... FROM original_table PARITION (xxx) WHERE ...;
删除原始(子)分区
ALTER TABLE original_table DROP PARTITION xxx;
重新插入更新的行
INSERT /*+append*/ INTO original_table SELECT * FROM updated_rows;
如果您对500M行有CTAS或INSERT INTO SELECT问题,请考虑对临时表进行分区并批量移动数据。
嗯...如果你有足够的空间,我会用好的更新行创建源表的“副本”,然后检查结果并在其后删除源表,最后将“复制”重命名为源。 是的,这有一个很长的执行时间,但这可能是一种无痛的方式,当然需要并行提示。
您可以考虑添加一个新列(标记)'已更新'位,通过fedault将值NULL(或0,i preffer NULL)添加到您的表中,并使用您需要更新的日期的批评,您可以更新数据组按照Kombajn描述的相同方式按组进行更新,一旦数据组更新,您可以将值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.