我们有一个包含10亿行的表。此表日期分区。在子分区中,我们需要将符合条件的5亿行的日期更新为新值。这肯定会影响新分区或其他东西的创建,因为该表在同一日期被分区。谁能指点我最好的方法呢?
提前致谢!
答案 0 :(得分:1)
如果要更新分区键并且源行位于单个(子)分区中,那么合理的方法是:
为更新的行创建临时表。如果可能,请立即执行更新
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问题,请考虑对临时表进行分区并批量移动数据。
答案 1 :(得分:0)
嗯......如果你有足够的空间,我会用好的更新行创建源表的“副本”,然后检查结果并在其后删除源表,最后将“copy”重命名为来源。是的,这有一个很长的执行时间,但这可能是一种无痛的方式,当然需要并行提示。
答案 2 :(得分:0)
您可以考虑添加新列(标记)'更新'通过fedault将值NULL(或0,我预先为NULL)添加到您的表中,并使用您需要更新的日期批评,您可以按照Kombajn描述的相同方式逐组更新数据,数据更新后,您可以影响值1到标记'更新'到您的数据组。
例如,让我们从制作数据组开始,让我们考虑组的标准是年份。所以我们开始逐年处理数据。
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;
希望这可以帮助您逐步处理数据,以防止等待表的所有数据一次更新。您可以考虑循环多年的游标。