2011-10-05 71 views
0

我試圖找到例子,但它們都是簡單的,只有一個where子句。這是情況。我有一堆從另一個數據庫傳輸的遺留數據。我也有相同數據庫中的「好」表。我需要將舊數據表(數據轉換)中的數據傳輸到w表中。因爲這是一組不同的表,所以數據轉換需要複雜的聯接才能將舊數據正確地放入新表中。你可以使用直接路徑插入連接嗎?

因此,舊錶的舊數據。

新表格必須包含舊數據,但它需要大量連接才能將舊數據正確地存入新表格。

我可以像這樣使用大量連接的直接路徑嗎? INSERT SELECT(大量連接) 直接路徑是否適用於已在同一數據庫上的表(表之間的傳輸)?是否僅用於從表示文本文件加載表?

謝謝。

回答

1

是的,查詢複雜度不應有任何限制。

如果你 插入/ * + APPEND * /成target_table選擇....從來源1,源2 ......,sourceN其中

它應該工作的罰款。但請考慮一下,負載的性能將受到該查詢性能的限制,因此,如果您期望獲得良好的性能,請確保它的調整良好。

最後,考慮在目標表上設置NOLOGGING是否會顯着提高性能。但是,如果您決定實施NOLOGGING,還要考慮備份恢復的含義。

希望幫助,

馬克

+0

這是否意味着我永遠不能備份數據庫或東西嗎?對不起,我不明白。 – johnny

2

在SELECT可以複雜到你會用直接路徑插入喜歡的查詢。直接路徑僅指目標表。它與數據讀取或處理的方式無關。

如果您正在執行直接路徑插入操作,則要求Oracle將新數據插入表的高位標記之上,以避免使用現有塊中的空間重用新行的正常代碼插入。它還必須阻止其他刀片,因爲在直接路徑插入過程中不能使刀片的高水位標記發生變化。這可能不是什麼大問題,如果你有一個停機時間窗口來執行負載,但是如果你希望現有的表在負載期間可用於其他應用程序,那麼這將是相當有問題的。

2

不,相反,這意味着您需要在NOLOGGING加載後執行備份,而不是您無法備份數據庫。

請允許我詳細說明一下。通常情況下,當您在Oracle中執行DML時,您所做的更改的前映像將登錄到UNDO,並且所有更改(包括UNDO更改)都會首先寫入REDO。這就是Oracle管理事務,實例恢復和數據庫恢復的方式。如果事務被中止或回滾,Oracle使用UNDO中的信息撤消您的事務所做的更改。如果實例崩潰,那麼在實例重啓時,Oracle將使用REDO和UNDO中的信息來恢復到上次提交的事務。首先,Oracle將讀取REDO並向前滾動,然後使用UNDO回滾崩潰時未提交的所有事務。通過這種方式,Oracle能夠恢復到上次提交的事務。

現在,當您在插入語句中指定APPEND提示時,Oracle將直接加載執行INSERT。這意味着數據將從高位標記之上加載到全新的,從未使用過的塊中。由於所加載的塊是全新的,所以沒有「前映像」,因此,Oracle可以避免編寫UNDO,從而提高性能。如果數據庫處於NOARCHIVELOG模式,那麼Oracle也不會寫REDO。在ARCHIVELOG模式下的數據庫中,Oracle仍然會寫入REDO,除非在執行insert/* + append * /之前,將表設置爲NOLOGGING(即alter table tab_name nologging;)。在這種情況下,表的禁用REDO日誌記錄。但是,這是您可能遇到備份/恢復影響的地方。如果您執行NOLOGGING直接加載,然後遭受介質故障,包含具有nologging操作的段的數據文件將從nologging加載之前執行的備份中恢復,那麼重做日誌將爲而不是包含更改需要恢復該段。那麼,會發生什麼?那麼,當您執行NOLOGGING加載時,Oracle會將範圍無效記錄寫入重做日誌,而不是實際的更改。然後,如果您在恢復時使用該重做,那些數據塊將被標記爲邏輯損壞。對該段的任何後續查詢都將得到一個ORA-26040錯誤。

那麼,如何避免這種情況呢?那麼,您應該始終在任何NOLOGGING直接加載後立即進行備份。如果您從之後的備份中恢復/恢復負載,則沒有問題,因爲數據將位於已恢復的文件中的數據塊中。

希望是十分明顯的,

馬克

相關問題