0
我有一個表有超過10萬個記錄,我必須從我從其他幾個表中獲得的數據更新這個表的多個列,這些表中有大量的記錄。所有的表都被編入索引更新大量的記錄
我嘗試了批量處理和併發會話更新,但它花費很長時間。這個問題有沒有其他方法?
我有一個表有超過10萬個記錄,我必須從我從其他幾個表中獲得的數據更新這個表的多個列,這些表中有大量的記錄。所有的表都被編入索引更新大量的記錄
我嘗試了批量處理和併發會話更新,但它花費很長時間。這個問題有沒有其他方法?
解決方案是建立一個全新的表格(帶有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,等後來的要求。
看看這個評論由約翰Bittner AskTom:http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:6407993912330 –
我沒有嘗試其中之一上面的方法和我從不同表中更新的多列,它仍然需要很長時間才能創建表。 – chapter473
我覺得有趣的是創建表需要很長時間,操作應該幾乎是即時的。你是否像這樣創建表「創建表xyz_HOLD作爲select * from xyz where rownum <1」?如果是這樣,你是否像這樣改變'改變tablexyz nologging'?另外,請注意他們正在使用的提示。 –