2008-09-16 62 views
1

我有一個應用程序,每天導入大量的數據,數十萬條記錄。
數據來自不同的來源。數據使用C#讀取,然後批量插入數據庫。

該數據然後被處理:管理大量數據 - 存儲過程或數據集或其他...?

  • 不同表是鏈接產生
  • 新表
  • 數據是使用複雜algorithmns校正(特定的表的總計具有與總零)

這些處理大部分都是在存儲過程中完成的。
儘管在C#中一些複雜的處理會更簡單,但將數據提取到數據集中並將其重新注入會顯着降低速度。
您可能會問爲什麼我在將數據插入數據庫之前不處理數據,但我認爲在內存中處理100,000條記錄並不實際,並且基於SQL集的命令在創建大量記錄時有幫助。

這可能會引發一個古老的使用存儲過程及其利弊的問題。 (例如,您如何對存儲過程進行單元測試?)

我想回應一下,您是如何處理大量數據以及如何解決問題的。

回答

1

我會使用SSIS或DTS(假設你在談論MSSQL)。它們是爲了這個目的而設計的,如果你需要的話,可以和SP一起工作。

另一種選擇是使用Perl預處理數據。儘管聽起來像一個奇怪的建議,但Perl在這些場景中實際上非常快。我過去曾用它在合理的時間內(即幾天而不是幾周)處理數十億條記錄。

關於「你如何測試單元測試存儲過程」,你可以用MBUnit像其他任何單元一樣測試它們。只有一點建議:數據的設置和回滾可能非常棘手,您可以使用DTS事務或顯式SQL語句。

1

當涉及到MSSQL中的事情時,我通常不得不同意Skliwz。 SSIS和DTS是要走的路,但是如果你不熟悉這些技術,他們可能會很麻煩。但是,還有一種方法可以讓您使用C#進行處理,並且仍然將數據保存在SQL Server中。

如果您真的認爲在C#中處理會更簡單,那麼您可能需要考慮使用SQL Server Project來創建database objects using C#。 SQL Server內部的CLR對象可以做很多非常強大的事情,這可以讓你在代碼觸及數據庫之前編寫和單元測試代碼。您可以使用任何標準的單元測試框架(NUnit,MSTest)在VS內對您的CLR代碼進行單元測試,而且您不必編寫大量難以管理的設置和拆卸腳本。

至於測試你的存儲過程,我會誠實地研究DBFit。你的數據庫不一定是未經測試的功能的黑洞:)

0

你在哪裏處理數據很大程度上取決於你在做什麼。例如,如果您需要放棄數據庫中不需要的數據,那麼您將在C#代碼中處理該數據。但是,數據庫中要處理的數據通常應該是「實施不可知」的數據。所以如果有人想從Java客戶端插入數據,數據庫應該能夠拒絕不良數據。如果你把這個邏輯放到你的C#代碼中,Java代碼將不會知道它。

有人反對並說「但我永遠不會使用其他語言的數據庫!」即使這是真的,你仍然會有數據庫管理員或開發人員使用數據庫,如果邏輯不在那裏,他們會犯錯誤。或者您的新C#開發人員將嘗試推入數據,而不知道(或忽略)用C#編寫的數據預處理器。

總之,您放入數據庫的邏輯應該足以保證數據正確無需依靠外部軟件。

相關問題