2014-10-01 24 views
1

我需要在Oracle 11g上更新大型索引組織表(主要是2000萬行)的主鍵。更新索引使用多個UPDATE查詢的組織表(臨時重複)

是否可以使用多個UPDATE查詢來做到這一點?即每次說100,000行的許多更小的更新。問題是這些UPDATE批次中的一個可能會暫時產生重複的主鍵值(在所有更新完成後都不會有重複項)。

所以,我猜我在問是否可以暫時禁用主鍵約束(但它是IOT所需的);或者以其他方式臨時修改表。我可以獨佔和離線訪問此表。

我能看到的唯一的解決方案是創建一個新表並完成後,刪除原始表和新表重命名爲原始表名。

我錯過了另一種可能性嗎?

回答

0

您不能禁用/從IOT刪除主鍵約束,因爲它是通過定義一個唯一索引。

當我需要改變的IOT這樣,我要麼做一個CTAS(CREATE TABLE AS)的新普通堆表,執行維護,然後CTAS一個新的IOT。

喜歡的東西:

create table t_temp as select * from t_iot; 
-- do maintenance 
create table t_new_iot as select * from t_temp; 

但是,如果你需要簡單地添加或加入一個新的領域,以現有密鑰,您可以通過創建新的IOT結構,然後直接填充做到這一步到位從舊的IOT查詢。

不幸的是,這是IOT的缺點之一。

0

我會推薦以下方法:

  1. 通過創建系統,單個分區 具有完全相同的結構,當前一個新的分區表IOT。

  2. 鎖定當前IOT表,以防止任何DML。

  3. 插入到新表從目前的表中選擇改變PK值選擇。如果需要,這個步驟 可以重複多次。在這種情況下,最好在另一個會話中使用 來鎖定原始表。新表的

  4. 交換分區與原始表。

相關問題