2009-07-16 81 views
2

我有這種情況,我正試圖想出最好的解決方法。我有一個數據庫,比如DB-A,帶有一個T-A表,它有兩個字段 - OID和PID。這張桌子有近100萬行。現在由於其他問題,大多數行的PID被錯誤地設置爲0,並且這僅在幾天後才被發現。更新Oracle中的大量行

我有一個從2天前的備份,說DB-B,我正在考慮用DB-B的匹配條目更新DB-A。那麼最好的辦法是什麼?我記住這一點:

  1. 創建一個.NET應用程序,該應用程序從DB-B獲取行並更新DB-A中匹配的行。不知道這是否會因爲大量的行而起作用。也許需要在一個範圍內的事務下進行單獨的提交。
  2. 創建.NET來生成從DB-B一個Oracle SQLLOADER文件並加載到DB-A

你的想法是不勝感激...

感謝 蘇尼特

回答

-2

可能有一個內置的工具,這一點,但如果是我,我可能會使用DB-B產生的update語句列表,並運行它們在DB-A腳本。

喜歡的東西:

select 'update T-A set PID = ' || PID || ' where OID = ' || OID || ';' from T-A 

(假設OID是你的主鍵,因爲你有大量的行,你可能把它分解成多個腳本別人或許可以提供。更優雅的解決方案)

+0

忘了提及OID是RAW16型。 – Sunit 2009-07-16 14:54:45

+0

還有一百萬個獨特的更新會對你的數據庫造成可怕的影響(即大量的解析開銷)。 – 2009-07-16 22:57:22

0

不能加載備份爲(EG)TB和做一個查詢,如:。

UPDATE T-A, T-B SET T-A.pid = T-B.pid WHERE T-A.oid = T-B.oid 

原諒我的MySQL-ESE SQL,但在理論上它shoulw工作。

0

如果您在DBA.TA和DBB.TB之間有一個1-1關係,那麼首先我會刪除DBA.TA,然後將Asmodon的回答UPDATE更改爲INSERT。

如果不可能,我會禁用/刪除DBA.TA上的每個約束/索引,執行更新,然後重新啓用/創建約束/索引。

問候。

1

如果你能建立從DB-A到DB-B一DBLINK,那麼你可以執行從DB-A簡單更新:

UPDATE (SELECT ta.pid ta_pid, tb.pid tb_pid 
      FROM ta ta 
      JOIN [email protected] tb ON (ta.oid = tb.oid)) 
    SET ta_pid = tb_pid; 

它會工作,如果OID是主鍵。