0

我有一個表有超過10萬個記錄,我必須從我從其他幾個表中獲得的數據更新這個表的多個列,這些表中有大量的記錄。所有的表都被編入索引更新大量的記錄

我嘗試了批量處理和併發會話更新,但它花費很長時間。這個問題有沒有其他方法?

+0

看看這個評論由約翰Bittner AskTom:http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:6407993912330 –

+0

我沒有嘗試其中之一上面的方法和我從不同表中更新的多列,它仍然需要很長時間才能創建表。 – chapter473

+0

我覺得有趣的是創建表需要很長時間,操作應該幾乎是即時的。你是否像這樣創建表「創建表xyz_HOLD作爲select * from xyz where rownum <1」?如果是這樣,你是否像這樣改變'改變tablexyz nologging'?另外,請注意他們正在使用的提示。 –

回答

0

解決方案是建立一個全新的表格(帶有nologging)並行化。

1)首先創建虛擬保持表(不帶行):

create table xyz_HOLD as select * from xyz where rownum<1 
避免記錄所有這些操作* ...

Alter table xyz_HOLD nologging

*隨着nologging,如果系統中止,只需重新運行「更新」再次,因爲你在主表

2)

 insert /*+ append parallel (xyzhold,12) */ 
     into xyz_hold xyzhold (field1, field2, field3) 
    select /*+ parallel (x,12) */ xyz.field1, my_new_value_for_field2, xyz.field3 
     from xyz x 
    where blah blah blah

3)完成後的原始數據,或者重命名錶,或交換分區,如果您的原始表爲p神聖的,你只更新一個分區,就像我們一樣。

+)顯然你也需要重建indecies,等後來的要求。