我正在閱讀並驗證通過我們的ASP.net網站(以VB.Net編碼)提交的大型固定寬度文本文件(範圍從10-50K行)。我對文件進行初步掃描以檢查基本問題(行長度等)。然後我將每行導入到MS SQL表中。每個DB行基本上由一個record_ID(主,自動遞增)和大約50個varchar字段組成。大量UPDATE查詢減慢頁面
插入完成後,我在文件上運行驗證函數,該函數根據一系列條件(修剪長度,數字,範圍檢查等)檢查每行中的每個字段。如果在任何字段中發現錯誤,它將在Errors表中插入一條記錄,其中包含error_ID,record_ID和錯誤消息。另外,如果該領域以特定方式失敗,我必須在該領域進行「重置」。重置可能包括消隱整個字段,或者簡單地用另一個值替換該值(例如,將字符串替換爲具有全部非法字符的新字符串)。
我有一個5000行測試文件。上傳,初始檢查和導入大約需要5-6秒。詳細的錯誤檢查並插入到錯誤表中大約需要5-8秒(該文件中有大約1200個錯誤)。但是,對於需要重置的750個字段,「重置」部分大約需要40-45秒。當我註釋掉重置函數(立即返回而不實際調用UPDATE存儲過程)時,該過程非常快。重置打開後,頁面會返回50秒。
我UPDATE存儲過程中使用一些從http://sommarskog.se/dynamic_sql.html推薦的代碼,因此它使用CASE,而不是動態SQL:
UPDATE dbo.Records
SET dbo.Records.file_ID = CASE @field_name WHEN 'file_ID' THEN @field_value ELSE file_ID END,
.
. (all 50 varchar field CASE statements here)
.
WHERE dbo.Records.record_ID = @record_ID
有沒有什麼辦法可以幫我的表現在這裏。我可以以某種方式將所有這些UPDATE調用分組到單個事務中嗎?我應該以某種方式重新修改UPDATE查詢嗎?或者它只是數量超過750+的更新,而且速度很慢(這是一個8GB RAM的四處理器服務器)。
任何建議表示讚賞。
+1對一個相當複雜的過程有很好的描述 – JYelton 2010-05-14 20:31:56
你有一個索引你正在查找的列? – 2010-05-15 17:05:45