簡體   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