簡體   English   中英

SqlBulkCopy.WriteToServer(DataTable)逐行:非常慢

[英]SqlBulkCopy.WriteToServer(DataTable) row by row: very slow

我必須制作將csv文件導入數據庫表的應用程序。 csv文件類似於~500rows ~30columns和距離不是很可靠的消息來源(可能包含損壞的數據)。

我像這樣CSV->DataTable->SqlBulkCopy.WriteToServer(DataTable)做到了。 並且它將500條記錄處理到非本地sql服務器大約4秒鍾 ,這不是什么大問題。 但是,由於csv可能包含損壞的數據(錯誤的日期格式,整數溢出等),因此我不得不使其出錯,並導入好行並跳過壞行。 將損壞的數據處理到DataTable時,但將DataTable導入到DataBase時,不會發生問題。 我所做的是TRY {}這樣在數據庫中逐行添加。

int Row = 0;
//csvFileData is the DataTable filled with csv data

foreach(DataRow RowToAdd in csvFileData.Rows) 
{
    //here it spents 1-2% of the time (problem not in DT  row by row processing)
    Row++;
    DataTable TempDT = new DataTable();
    TempDT = csvFileData.Clone();
    TempDT.ImportRow(RowToAdd);

    try 
    { 
        //here it spents 98% of the time
        s.WriteToServer(TempDT);

    } 
    catch(Exception importex)
    {
        Console.WriteLine("Couldn't import {0} row, reason", Row, importex.Message);
    }

}

調用: s.WriteToServer(scvFileData);
就我而言,一次是不好的。

結束它確實很好。 問題在於執行時間增加到15秒,這很多。 因為它確實與數據庫的每一行進行前進和后退通信。 我怎樣才能解決這個問題。 我正在考慮模擬諸如數據庫表設計的本地克隆之類的東西。 嘗試{}在其上逐行嘗試,然后排除不良行,然后將整個DataTable(已刪除不良行)導入。 或者逐行執行一些異步導入,但是我認為行可能會按順序亂碼,或者丟失甚至重復。 有人可以給個小費嗎?

一行的批量插入比單行的插入慢10倍以上。 您當前的策略不起作用。

驗證並清除客戶端上的數據。 必須保證插入成功。 將其復制到DataTable 一次全部插入,或至少插入大量(插入的性能開始出現在100或1000行中)。

如上所述,一種明顯的解決方案是驗證從CSV文件讀取的數據,並僅用“好行”填充數據表。

如果您的驗證包括數據類型檢查,即,如果字符串可以由目標系統(此處為SQL-Server)轉換,則可以在此處復制邏輯,即,重新編程已在SQL Server中實現的解析/轉換邏輯。 這不是一個大問題,但是從設計角度來看並不一定很聰明。

實際上,您可以使用BULK INSERT命令將CSV文件直接導入SQL-Server。

因此,另一種方法可能是將原始數據導入服務器中的臨時表中,然后進行數據類型檢查。 當您碰巧運行SQL 2005或更高版本時,這非常容易。 他們介紹了ISDATEISNUMERIC類的函數。

BULK INSERT CSVRawData FROM 'c:\csvtest.txt' WITH (
  FIELDTERMINATOR = ',', ROWTERMINATOR = '\n'
)

INSERT INTO FinalTable 
SELECT * from CSVRawData
 WHERE ISDATE(DateField) 
   and ISNUMERIC (NumericField)

如果發生以下情況,我個人將采用這種方式:

  • CSV文件具有固定格式
  • 進行完整性檢查很容易用SQL編寫代碼

例如,我們以這種方式分析日志文件。 它們包含50個Mio +行,其中一些已損壞,或者我們根本不感興趣。

暫無
暫無

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

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