2014-01-09 63 views
0

我在表中插入了數百萬條記錄,這樣的操作將需要數小時甚至一天的時間。 2小時後,通過我的電腦連接斷開,所以我想從頭開始重複插入。
我的問題
哪個更快?截斷表並重復一次,創建主鍵並繼續,但是由於在過去2小時內插入的每條記錄都存在'違反唯一約束',因此會引發錯誤。違反錯誤性能的唯一約束條件

+0

你是如何做插入?爲什麼從一開始就重複如果已經提交了一些數據 - 不會從第一次插入的第一個記錄開始更有意義? (希望你一次不插入/提交一行......並且沒有任何索引或觸發器)。 –

+0

@AlexPoole我有一張包含數百萬條記錄的表格,我想將它分成4個表格。原始表具有日期欄(第1年2年3年和第4年),因此每年在原表中將數據插入表1。所以在我的場景中,我將orignal的數據插入到4個表中。 – Moudiz

+0

但是由什麼機制?你正在做'insert into new_table_1 select ... from orig_table where year = ...',或者選擇所有的記錄,循環它們,然後決定哪個表格可以逐一插入每條記錄?在什麼環境/語言中 - 聽起來你可能把整個表格通過網絡拉回到你的電腦,然後將它推回到四個新表格中,這將會很慢,而不是在數據庫中完成所有工作。當然,這並不是真正的問題。 (你有沒有考慮過分區?)。 –

回答

1

截斷表(如果完全刷新)是最好的選擇。如果使用Oracle的SQL*Loader實用程序,還有SKIP參數。讓我在一定程度上解釋!

另請嘗試使用加載選項DIRECT加載SQL * Loader表。這意味着通過加載到數據塊而不是傳統的INSERT語句來加載表。

通過這種負載,可以啓用UNRECOVERABLE,這意味着沒有/較少的重做日誌寫的,因此加載速度非常快> 70比傳統INSERT%。

但是,這種裝載的缺點是,此表上的所有索引,除了NULL約束將進行UNUSABLE,裝載開始前,數據將被加載。並且在SUCCESSFUL完成時,SQL*Loader試圖通過重建它來重新啓用索引。所以,如果萬一我的任何原因,加載已經中斷,錯誤信息將被正確記錄,並且索引將被保留爲UNUSABLE

的更多詳細信息:請找Here
DIRECT/CONVENTIONAL加載)

此外,使用SQL*Loader,您可以加載使用Conventional加載,這意味着SQL*Loader將使用該文件生成的INSERT的塊,並且過程它。在這種類型的加載中,所有的INDEXES都將保持原樣,並且表格仍然沒有受到傷害。

如果發生任何錯誤,SQL*Loader將記錄一個SKIP參數,這意味着,如果您指定該數字,則在下一次運行時,將從該文件的該點加載該表。

更多細節SQL*LoaderHere

+0

我正在運行pl/sql,所以我cannut使用sql * loader但是很好的解釋。 – Moudiz

0

不知道你是如何加載你的表,但是這是一個典型的情況下,你應該使用Oracle的外部表。

+0

你的意思是通過外部的oracle表嗎? – Moudiz

+0

簡而言之,使用外部表格,您可以直接從數據文件查詢數據。請轉至此[文檔](http://docs.oracle.com/cd/B28359_01/server.111/b28319/et_concepts.htm#g1017623)以獲取更多信息。 – San

相關問題