2012-03-06 79 views
1

有大約這裏400 MB .txt文件由分隔插入數據「|」。在C#中使用Windows窗體,我將.txt文件的每一行插入到SQL服務器數據庫的表中。從文本文件到SQL服務器(?速度法)

我在做什麼是簡單,就是(縮短了「......」爲了簡潔):

while ((line = file.ReadLine()) != null) 
{ 
    string[] split = line.Split(new Char[] { '|' }); 

    SqlCommand cmd = new SqlCommand("INSERT INTO NEW_AnnualData VALUES (@YR1984, @YR1985, ..., @YR2012)", myconn); 
    cmd.Parameters.AddWithValue("@YR1984", split[0]); 
    cmd.Parameters.AddWithValue("@YR1985", split[1]); 
    ... 
    cmd.Parameters.AddWithValue("@YR2012", split[28]); 

    cmd.ExecuteNonQuery(); 
} 

現在,這是工作,但一段時間服用。這是我第一次用大量的數據做任何事情,所以我需要確保:A)我以高效的方式做到這一點,B)我的期望不是太高。

使用SELECT COUNT(),而循環是怎麼回事,我可以看數量上去了一段時間。所以我用了一個時鐘和一些基本的數學來確定事物的運行速度。 在60秒內,有73881個插入。這是每秒1231個插入。問題是,這是一個平均速度,還是我表現不佳?如果是後者,我能做些什麼來提高性能?

我看過一些關於SSIS是有效的用於這一目的完全吻合。但是,我需要通過單擊Windows窗體中的按鈕來執行此操作,而不是通過SISS。

回答

2

看一看SqlBulkCopy on MSDN,或nice blog post here。對我而言,每秒鐘可達數萬次插入。

+0

這正是我所需要的。起初我有一個問題,因爲有太多的數據,我得到OutOfMemory異常,但這篇文章讓我走上了正確的道路:http://stackoverflow.com/questions/9442171/a-way-out-from -getting-systemoutofmemoryexception-while-imports-from-large-tex – CptSupermrkt 2012-03-07 00:27:05

1

我認爲SSIS是很多比這種類型的方法更快,但有一堆變量會影響性能。

如果你想與SSIS實驗,使用導入和導出嚮導Management Studio中生成一個SSIS包將導入一個管道分隔的文件。您可以將該程序包存儲並從.NET應用程序運行。

有關如何以編程方式運行SSIS包的信息,請參閱此文章:http://blogs.msdn.com/b/michen/archive/2007/03/22/running-ssis-package-programmatically.aspx。它包括如何從客戶端,服務器或任何地方運行的選項。

而且,看看本文的其他方法可以改善一般批量插入性能。 http://msdn.microsoft.com/en-us/library/ms190421.aspx

+0

這不需要客戶端部署SSIS組件嗎?如果你升級你的SQL Server版本,SSIS包通常也需要更新。 – Andomar 2012-03-06 07:04:44

+0

上面的鏈接詳細介紹了從代碼執行SSIS包的多種方法,其中3個可以遠程運行,包括選項,無需部署客戶端工具。另外,我不需要對從05到08到R2的SSIS包進行任何更改。因人而異。 – 2012-03-06 07:13:40

2

我有Andomar同意。我真的很喜歡SqlBulkCopy。它非常快(您需要play around with BatchSizes以確保找到適合您的情況的文件)。

有關討論各種選項的真正深入的文章,請查看Microsoft的「數據加載性能指南」; http://msdn.microsoft.com/en-us/library/dd425070(v=sql.100).aspx

另外,看看SqlBulkCopy爲CSV Reader的C#示例。它不是免費的,但如果你能夠在更短的時間內寫出一個快速準確的解析器,那就去做吧。至少,它會給你一些想法。

2

哦 - 這種方法會給你帶來驚人的表現。嘗試使用BULK INSERT,如下:

BULK INSERT MyTable 
    FROM 'e:\orders\lineitem.tbl' 
    WITH 
    (
     FIELDTERMINATOR ='|', 
     ROWTERMINATOR ='\n' 
    ) 

這是在性能方面的最佳解決方案。有一個缺點,即文件必須存在於數據庫服務器上。有兩種解決這個,我已經在過去使用的,如果你不從那裏你正在運行的進程訪問服務器的文件系統。一種方法是在工作站上安裝SQL Express實例,將主服務器添加爲工作站實例的鏈接服務器,然後運行「BULK INSERT MyServer.MyDatabase.dbo.MyTable ...」。另一種選擇是將CSV文件重新格式化爲XML格式,該格式可以非常快速地處理,然後將XML傳遞給使用OPENXML進行查詢和處理。 BULK INSERT和OPENXML在MSDN上都有很好的文檔記錄,您最好仔細閱讀這些示例。

相關問題