2008-09-26 56 views
4

我即將開始編寫windows窗體應用程序,該程序將打開一個管道分隔且大小約爲230 mb的txt文件。這個應用程序然後將這個數據插入到一個SQL Server 2005數據庫(顯然這需要迅速發生)。我爲這個項目使用c#3.0和.net 3.5。從平面文件中插入數百萬條記錄到SQL Server中有哪些缺陷?

我不是要求應用程序,只是在這裏一些共同的建議和潛在的陷阱建議。從我收集的網站中可以得知,SQL大容量複製是一個先決條件,有什麼我應該考慮的(我認爲只需用表單應用程序打開txt文件將是一個很大的努力;也許將其分解爲blob數據?)。

謝謝,如果有人需要,我會編輯清晰的問題。

回答

16

你是否必須編寫一個winforms應用程序?使用SSIS可能會更容易,更快速。有一些內置任務可用,尤其是Bulk Insert task

此外,值得一試Flat File Bulk Import methods speed comparison in SQL Server 2005.

更新:如果你是新來的SSIS,看看這些網站讓你的快車道。 1)SSIS Control Flow Basics 2)Getting Started with SQL Server Integration Services

這是另一個如何:在importing Excel file into SQL 2005

+0

在SSIS中更容易和更快......同意。 – EvilSyn 2008-09-26 20:00:54

+0

我發現SSIS是一個巨大的痛苦在守護者。它更頻繁地針對奇怪的重複,需要DBA訪問數據庫服務器以排除故障/修復/重新運行(這在我們的生產環境中受到限制)。 – 2008-09-26 20:04:03

1

這將是一個流式的努力。

如果可以,請勿在此處使用交易。交易成本太高了。

所以你要做的是一次讀取一行文件並一次插入一行。您應該將失敗的插入轉儲到另一個文件中,稍後您可以診斷並查看失敗的位置。

起初,我會繼續嘗試插入幾百行的數據,以確保流式傳輸工作正常,然後您可以打開所有您想要的內容。

1

您可以嘗試使用SqlBulkCopy。它可以讓你從「任何數據源」拉。

0

如果文件的列格式與數據需要結束的目標表格匹配,我寧願使用命令行實用程序bcp加載數據文件。它非常快速,您可以指定錯誤文件以查找任何未能插入的「奇怪」記錄。

如果您需要爲其存儲命令行參數(服務器,數據庫,用戶名/密碼或可信連接,表,錯誤文件等),您的應用可以啓動該命令。

我喜歡這種方法比運行BULK INSERT SQL命令更好,因爲數據文件不需要位於數據庫服務器可訪問的系統上。要使用批量插入,您必須指定要加載的數據文件的路徑,因此它必須是系統用戶在運行加載的數據庫服務器上可見和可讀的路徑。通常對我來說太麻煩了。 :-)

1

正如旁註所示,刪除表的索引並在批量插入操作後重新創建它們有時會更快。

0

你談論的數據量實際上並不那麼龐大。我不知道你的效率問題是什麼,但是如果你可以等待幾個小時讓它插入,你可能會驚訝於用一種真正天真的技術來完成每一行的每一行。一次將幾千行左右的數據集合在一起,並將它們提交給SQL服務器可能會使其更快一些。

只是一個建議,可以爲您節省一些嚴重的編程時間,如果你不需要它可以想象得那麼快。取決於導入的運行頻率,節省幾天的編程時間可能很容易,因此可以在運行時等待幾個小時。

0

您可以使用SSIS讀取&插入,但將其作爲您的WinForms應用程序中的包調用。然後你可以傳入諸如源,目標,連接字符串等參數/配置。

方法文檔:http://msdn.microsoft.com/en-us/library/aa337077.aspx

您可以設置轉換和錯誤內SSIS處理和邏輯分支基於輸入參數甚至創造。

1

您可能會考慮從完全恢復切換到批量記錄。這將有助於保持備份的合理大小。

1

我完全推薦SSIS,你可以讀取數百萬條記錄並在相對較少的時間內清理它們。

您將需要留出一些時間來掌握SSIS,但它應該得到回報。這裏有上這麼幾個其他線程這將可能是有用的:

What's the fastest way to bulk insert a lot of data in SQL Server (C# client)

What are the recommended learning material for SSIS?

您也可以從C#程序包。我有一個C#程序,它從遺留系統讀取3GL「主文件」(使用我爲相關項目提供的API解析對象模型),獲取包模板並修改它以生成ETL包。

相關問題