簡體   English   中英

使用C#優化向SQL Server 2005的數據導入

[英]Optimizing Importing of Data to SQL Server 2005 with C#

我有一張桌子,上面有約1/2百萬條記錄。

每個月,我們都會導入大約1/2百萬條記錄。 這些文件目前被推送到數據庫中的另一個表中,但最終將直接從txt文件中加載。 對於每個這些新記錄,我必須確定是否已經有該記錄,如果沒有,則需要將其插入。 但是,如果我們有記錄,則需要對其進行更新。 這些更新包含C#代碼,這是有邏輯的。

AC#命令行程序正在處理此新數據的導入,因此,現在有1/2百萬條選擇語句-每條記錄一個。 然后,生成一堆(大約為1/2百萬)的插入和更新語句並針對數據庫運行。

在我的工作站上運行此程序大約需要6個小時。 您對如何加快速度有任何想法嗎? 我需要遍歷這些大型導入中的大約60種,以使數據庫到當前月份為止,然后每月加載一次新數據。

我認為可以改進的一個方面是1/2百萬條選擇語句。 也許我可以發出一個select語句來獲取所有行,並將它們存儲在內存中並進行搜索。 我可以為此使用列表,還是有更好的課程? 我必須基於兩個屬性(或數據庫字段)進行搜索。

看一下.NET Framework 2.0的SqlBulkCopy類。

MSDN 參考

是的,將邏輯移動到單個存儲的過程中,該過程將批量插入到臨時表中(不進行日志記錄,然后在兩條單獨的語句中處理臨時表中的所有記錄...對所有存在的記錄進行一次更新在desti表中,並為所有未插入的表插入一個

   Update DestTable Set
       ColName = T.ColName,
       [repeat for all cols]
    From TmpTable T Join DestTable D On D.Pk = T.Pk

    Insert DestTable(ColList)
    Select [ColList]
    From TmpTable T
    Where Not Exists (Select * From DestTable
                      Where pk = T.Pk)

如果這對於您的事務日志而言導致事務過大,請將其分解成較小的塊

暫無
暫無

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

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