2008-10-14 52 views
1

Oracle編程新手(來自Sybase和MS SQL Server)。什麼是「Oracle方式」避免用大量更新填寫傳輸日誌?Oracle SQL技術避免填充傳輸日誌

在我的具體情況下,我正在更新可能的大量行。這裏是我的方法:

UPDATE my_table 
SET a_col = null 
WHERE my_table_id IN 
(SELECT my_table_id FROM my_table WHERE some_col < some_val and rownum < 1000) 

...這裏我執行這個循環中,直到更新的行數爲零,

這是最好的方法?

謝謝,

回答

1

如果您在多次運行(例如1000條記錄)中分解UPDATE,則對重做和撤消日誌的更新量根本不會減少。最重要的是,與運行單個大型SQL相比,總查詢時間最有可能更高。

沒有真正的方法來解決UPDATE中的UNDO/REDO日誌問題。有了插入和創建表,你可以使用直接又名APPEND選項,但我想這並不容易爲你工作。

0

任何更新將生成重做。實際上,更新所有行的單個UPDATE將產生最小的總重做量並在最短的時間內運行。

假設您正在更新表中的絕大多數行,如果有任何使用A_COL的索引,最好在更新之前禁用這些索引,然後在使用NOLOGGING指定後重建這些索引大量的UPDATE語句。另外,如果由於更新而需要觸發/驗證任何觸發器或外鍵,暫時刪除這些觸發器或外鍵可能會有所幫助。

+0

賈斯廷,你的索引禁用評論是唯一可行的,如果新的更新空值與總表大小的比例非常高,大概80-90%左右。做一個完整的索引重建(從頭開始,而不是從現有的)需要一個所有行的排序。 – 2008-10-14 00:39:45

+0

非常真實。當我最初閱讀Rob發佈的查詢時,我沒有注意到WHERE子句的some_col 2008-10-14 00:54:20

1

取決於行數百分比幾乎與數字一樣多。還取決於更新是否使行比以前更長。即在每行中從零到200bytes。這可能會影響你的性能鏈式行。

無論哪種方式,你可能都想試試這個。

構建一個新表格,將該列更正爲select的一部分而不是更新。你可以通過CTAS(Create Table as Select)建立新的表格,避免記錄。

拖放原始表格。

重新命名新表格。

重新編制,重新指向contrainst,重建觸發器,重新編譯包等

你能避免很多記錄這種方式。