2017-08-17 76 views
2

我正在向從JDBC連接到靜態 Oracle 12c數據庫的表中寫入大量行(〜2000萬)。我想提交每10,000行以防止回滾,這樣如果出現錯誤,我可以有效地重新啓動上次提交的插入命令。提交表格中的每個x行

什麼是最有效的(時間和資源)方式,我可以使用JDBC來做到這一點?

請注意,這將是來自大型基礎表連接的INSERT INTO SELECT語句。因此,遊標會顯着減慢插入語句 - 它們是否真的是最好的解決方案?

+0

我不知道你在問什麼 - 如何限制'選擇'部分只有10,000行?如何識別它們是哪些行,和/或排除先前插入的行?你爲什麼不把它當作一個* single *'insert ... select'語句在最後進行一次提交 - 所以你不必擔心重新啓動 - 這將是最有效的(只要你有足夠的撤消空間)?爲什麼會有一個批次發生10,000錯誤,如果它發生了,你將如何修復它? –

+0

由於插入的行數很多,插入操作需要很長時間,不幸的是這需要在相當短的時間內處理。如果插入有問題並且我們失去了所有的進度,我們將不得不從頭開始重新啓動,另外我不知道我們是否有足夠的資源(撤消空間)來一次處理這一切。這回答了你的問題了嗎? –

+1

種類,但是批量和提交速度會更慢(如果沒有錯誤) - 可能會慢得多,這取決於您如何識別每個批次中的10,000個進入。我仍然不確定哪一點你需要幫助,或者你如何考慮使用遊標。 –

回答

0

一般而言,單個insert into ... select ...將是最有效的(如果您的系統將處理它)。

如果你真的想它分裂您可以使用方案,如

while <rows still need inserting> 
    insert into x 
    select from y where (y is not x) and rownum < 10000; 
    commit 

其中(y is not in x)not in(),一個NOT EXISTS()或其他這樣的機制只選擇尚未插入的行。