2017-08-26 34 views
4

我正在使用Visual Studio Web應用程序使用ASP.NET MVC & C#。我有一個超過100000個記錄的Excel文件,用於導入SQL Server 2008 R2。如何優化數據導入SQL Server與100000個併發用戶數100000條記錄

我使用SqlBulkCopy與ado.net DataTable複製數據到表(Table1)。

然後驗證和處理數據並用有效/無效標記。

然後添加和使用存儲過程從Table1更新記錄到3個表(Table2Table3Table4)。

Table4包含2個觸發器,它使用光標更新Table4和另一個表(Table2)中與其有關的幾條記錄。

從本地機器以調試模式測試10000分鐘的記錄時,需要1分鐘。

如果10或100個用戶同時導入,它會支持嗎?

有沒有更好的過程來改進和支持許多併發用戶?

我的電腦配置:

  • 的Windows 10 64位
  • AMD FX QuardCore 3.6 GHz處理器
  • 8GB RAM

  • 的Excel文件包含50列

  • BulkCopy需要2 - 3秒
  • 存儲的p rocedure需要30秒到2分鐘

當我和5個併發用戶,2個或3個過程測試成功執行,我得到這個錯誤:

Transaction (Process ID 66) was deadlocked on lock | communication buffer resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

+0

看來你的問題是關於存儲過程的性能和併發性。添加DDL(包括索引)以及proc和觸發代碼到您的問題。通常,遊標對性能不利,將觸發器代碼移動到proc可能會更好。 –

+0

導入中有很多部分。確定哪個部分花費的時間最長。我總是懷疑遊標。 –

+0

我試過禁用觸發器,但沒有成功。 – Debashis

回答

2

看看&嘗試呼嚕棧項目,你可以在幾秒鐘內批量插入一百萬條記錄。 它支持實體框架,Dapper。 ZZZProject

+0

如何將EF引入混音使得這個運行速度更快? –

1

將此記錄插入或導入到新表或臨時表中,或稍後複製/移動到目標表。

+0

正如我所提到的,Table1是我的臨時表。我將(批量複製)數據複製到Table1中,然後將數據添加或更新到目標表(表2,表3和表4) – Debashis

+0

將nolock添加到查詢,更改轉換隔離級別,使用預先編譯的代碼dll,禁用表上的觸發器。 – user

2
  1. 您可以在導入過程中禁用(或者可能會刪除並重新創建)索引嗎?索引緊固選擇,但減慢插入和更新大型表?使用MERGE代替INSERT和UPDATE。

  2. 查找遊標的替代方法(如CTE或while循環或MERGE語句)或使用FAST_FORWARD遊標(如果尚未使用)。

  3. 您如何驗證數據。這一步足夠快嗎?

  4. 在批量處理過程中是否需要觸發器?這些表是從哪裏使用的。每行都會執行的觸發器代碼,您可以在批量導入過程中批量執行該代碼。在Sql中有一個DISABLE觸發器的選項。檢查是否適合您的目的。

  5. SSIS包也可以導入數據和做這樣的事情。

  6. 您可以創建table2_temp,table3_temp,table4_temp(可能是每個用戶動態地拖放它們)。如果表4中的觸發器不適用於預先存在的數據,則分別進行處理並將其合併到主表2,表3,表4中。

1

添加鎖定查詢,所以你不會阻止操作。

相關問題