[英]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.