2017-08-15 50 views
2

我想使用我在C#中編寫的解決方案將大量數據從SQL Server傳輸到MongoDB(大約8000萬條記錄)。 我想一次轉移200 000條記錄,但我的問題是跟蹤已經轉移的內容。通常我如下會做到這一點:將大數據遷移到新數據庫

Gather IDs from destination to exclude from source scope 
Read from source (Excluding IDs already in destination) 
Write to destination 
Repeat 

的問題是,我建立在C#中含有存在於目標,排除那些來自源選擇,例如爲目的的所有ID字符串。

select * from source_table where id not in (<My large list of IDs>) 

現在你可以想像,當我已經插入600條000多個記錄,然後建立與所有的ID字符串什麼這裏發生,它變大,更會減慢速度,所以我在尋找一個一次迭代200 000條記錄的方式,如遊標,但我從來沒有做過這樣的事情,所以我在這裏尋找建議。

只是作爲參考,我做我的內容如下

SqlConnection conn = new SqlConnection(myConnStr); 
    conn.Open(); 
    SqlCommand cmd = new SqlCommand("select * from mytable where id not in ("+bigListOfIDs+")", conn); 
    SqlDataReader reader = cmd.ExecuteReader(); 
    if (reader.HasRows) 
    { 
     while (reader.Read()) 
     { 
      //Populate objects for insertion into MongoDB 
     } 
    } 

所以基本上,我想知道如何通過大量數據的迭代,而不選擇在一個全力以赴的數據,或有過濾數據使用大字符串。任何幫助,將不勝感激。

回答

0

有很多不同的方法可以做到這一點,但我會首先建議你不要試圖重新發明輪子,而是看看現有的程序。 有許多程序設計用於在不同數據庫之間導出和導入數據,有些程序非常靈活且昂貴,但其他程序則帶有免費選項,大多數DBMS程序都包含某些內容。

選項1:

使用SQL Server Management Studio中(SSMS)導出嚮導。

這允許您導出到不同的來源。如果需要,您甚至可以編寫複雜的查詢。點擊此處瞭解詳情:

https://www.mssqltips.com/sqlservertutorial/202/simple-way-to-export-data-from-sql-server/

選項2:

出口升序ID爲了您的數據。 將最後導出的ID存儲在表中。

出口下一組數據,其中ID> lastExportedID

方案3:

在備份表創建數據的副本。 從此表導出,並在導出它們時刪除記錄。

+0

我希望有一些方法可以通過一些類似遊標的方法或異步方法一次遍歷N個記錄,但經過大量的搜索後,我空手而出。我必須解決將最後使用的ID存儲在單獨的表中的方法。謝謝你的幫助。 – Anomaly

1

需要更多的代表發表意見,但如果你按你的id列,你可以改變你的where子句成爲

select * from source_table where *lastusedid* < id and id <= *lastusedid+200000* 

,這將給你20萬,你問的範圍內,你只需要存儲單個整數