2014-10-16 84 views
1

要求:我有多個數據庫(Oracle/SQL Server)等。從數據庫中我需要將大量/大量數據導入到ac#程序中,並將數據與一個和別的。數據集中的每個數據文件都有一個密鑰(不是100%唯一的,也可能有重複的),使用該密鑰我可以比較其他數據集文件/數據庫。檢索並比較具有多列的超大型數據集

每個數據庫將返回約150萬行。我有5個不同的數據庫,我將從中獲取數據。即750萬行將被加載到我的程序中。

  1. 將數據加載到程序中的最佳方式是什麼(當前每個SQL在數據庫端需要5分鐘)。加載到CSV然後用C#讀取?任何其他想法?

  2. 我打算在c#中將數據加載到HashSet中,這是不錯的選擇嗎?

DB 1: 
Account Amount 
1234 1 
9999 66 

DB 2: 
Account Amount 
1234 2 
9999 66 

DB 3: 
Account Amount 
1234 1 
9999 66 

DB 4: 
Account Amount 
1234 10 
9999 66 

After comparing the output looks like 
Account DB1 Amt DB1 Amt DB3 Amt DB4 Amt Match? 
1234 1 2 1 10 No 
9999 66 66 66 66 Yes 
+0

如果它不是唯一的,那麼它不是一個關鍵。什麼是數據集中的數據文件? 2從哪裏來的DB1? – Paparazzi 2014-10-16 18:21:51

+0

香膏,你是在說原始/第一篇文章中的決賽桌嗎?它的一個問題2屬於DB2。 – CoolArchTek 2014-10-16 18:40:09

+0

個人來說,我會從數據庫中提取數據,然後導入到SQL Server中,然後編寫SQL進行比較(使用EXCEPT關鍵字很容易與MS SQL Server進行比較) – UnhandledExcepSean 2014-10-16 18:45:13

回答

0

恕我直言,這是不是一個巨大的問題。這是一箇中等大小的問題,在這個問題中你必須處理7.5個問題。在你的例子中,這些行看起來相對較短。如果您可以訪問超過2 GB RAM的計算機,則可以很容易地在RAM中完成整個工作。典型的2011年時代筆記本電腦可以做到這一點。幾乎所有的Win x64筆記本電腦都可以在RAM中完成。

您問是否應該直接從數據庫系統或CSV中繪製數據。如果你打算在生產中使用這個系統,你應該堅持使用數據庫系統。這避免了錯誤處理陳舊數據的可能性。

從您的問題看,您的各種系統中的Account值看起來完全匹配,沒有大量關於模糊匹配的猴子業務。也就是說,在幾個數據庫中,帳戶似乎被稱爲「1234」,而其中一個帳戶不是「1234」,另一個是「1234-001」,第三個是「A1234-2014」。這是個好消息。這意味着你可以使用諸如HashSets之類的東西在內存中處理它們。

您可能應該設置系統,以便它可以處理所有數據或Account值的任意子集。例如,您可能允許將子集指定爲'1000' - '1999'。這對於測試非常有用,因爲只需幾千個帳戶即可進行短期運行。這意味着你可以使用短期運行的子集查詢來處理所有事情。當你確信一切正常時,你就可以開始生產運行並回家過夜。

請注意,如果這是一次性工作,只需在您的個人計算機上安裝一些DBMS(MySQL或PostgreSQL將是很好的開源選擇),將各種數據庫系統的各種提取內容加載到表中它,並加入他們。

最後,如果您繼承未知質量的數據,Google可讓您下載一個非常有用的數據檢查和清理工具,名爲OpenRefine

+0

感謝Ollie。但其他數據庫查詢需要20-30才能返回數據。對於論壇,我只是概述了我的問題。此外,我應該早些提到這一點,我得到的數據是舊的(過去24個月)。 – CoolArchTek 2014-10-16 18:39:03

+1

我強烈支持奧利的建議來處理數據的子集。這允許您在處理另一個集合時開始檢查結果。但更重要的是(對我來說,至少)是這樣的,你可以通過選擇你離開的地方來處理中斷。我預計這將非常有益。 – DeadZone 2014-10-16 18:47:29

+0

@DeadZone是的,沒有開玩笑,這種數字化的工作幾乎無法在一次運行中完成。 – 2014-10-16 18:49:54