簡體   English   中英

從平面文件中將數百萬條記錄插入SQL Server有哪些陷阱?

[英]What are the pitfalls of inserting millions of records into SQL Server from flat file?

我即將開始編寫一個Windows窗體應用程序的旅程,該應用程序將打開一個管道分隔的txt文件,大小約為230 mb。 然后,此應用程序將此數據插入到sql server 2005數據庫中(顯然這需要迅速發生)。 我在這個項目中使用c#3.0和.net 3.5。

我不是要求應用程序,只是在這里提供一些公共建議和潛在的陷阱建議。 從我收集的網站上我已經知道SQL批量復制是一個先決條件,我應該考慮一下(我認為只需用表格應用程序打開txt文件將是一項很大的努力;可能會將其分解為blob數據?)。

謝謝,如果有人需要,我會編輯問題以便清楚。

你必須寫一個winforms應用程序嗎? 使用SSIS可能更容易,更快捷。 有一些內置任務可用,尤其是批量插入任務

此外,值得檢查平面文件批量導入方法在SQL Server 2005中的速度比較。

更新:如果您是SSIS新手,請查看其中一些網站,以便快速了解。 1) SSIS控制流程基礎知識 2) SQL Server Integration Services入門

這是另一個如何: 將Excel文件導入SQL 2005

這將是一個流媒體的努力。

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

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

起初我會繼續嘗試大量插入幾百行,只是為了看到流媒體正常工作,然后你可以打開所有你想要的。

您可以嘗試使用SqlBulkCopy 它允許您從“任何數據源”中提取。

就像旁注一樣,刪除表的索引並在批量插入操作之后重新創建它們有時會更快。

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

我完全推薦SSIS,您可以在相對較短的時間內閱讀數百萬條記錄並進行清理。

你需要留出一些時間來掌握SSIS,但它應該得到回報。 SO上還有一些其他線程可能會有用:

什么是在SQL Server中批量插入大量數據的最快方法(C#客戶端)

SSIS的推薦學習材料是什么?

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

如果文件的列格式與數據需要結束的目標表匹配,我更喜歡使用命令行實用程序bcp來加載數據文件。 它非常快,您可以為任何無法插入的“奇怪”記錄指定錯誤文件。

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

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

您所談論的數據大小實際上並不是那么巨大。 我不知道您的效率問題是什么,但是如果您可以等待幾個小時來插入它,您可能會驚訝於使用一種非常天真的技術來實現它是多么容易,只需一次插入一行。 一次批量處理一千個行並將它們提交給SQL服務器也可以使它快得多。

只是一個可以節省一些嚴肅的編程時間的建議,如果你不需要它可以想象得那么快。 根據導入運行的頻率,節省幾天的編程時間可能很值得,以換取在運行時等待幾個小時。

您可以使用SSIS進行讀取和插入,但可以從WinForms應用程序中將其稱為包。 然后你可以傳遞源,目標,連接字符串等內容作為參數/配置。

HowTo: http//msdn.microsoft.com/en-us/library/aa337077.aspx

您可以在SSIS中設置轉換和錯誤處理,甚至可以根據輸入參數創建邏輯分支。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM