如何优化数据导入SQL Server与100000个并发用户数100000条记录

问题描述:

我正在使用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

看看&尝试呼噜栈项目,你可以在几秒钟内批量插入一百万条记录。 它支持实体框架,Dapper。 ZZZProject

+0

如何将EF引入混音使得这个运行速度更快? –

将此记录插入或导入到新表或临时表中,或稍后复制/移动到目标表。

+0

正如我所提到的,Table1是我的临时表。我将(批量复制)数据复制到Table1中,然后将数据添加或更新到目标表(表2,表3和表4) – Debashis

+0

将nolock添加到查询,更改转换隔离级别,使用预先编译的代码dll,禁用表上的触发器。 – user

  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中。

添加锁定查询,所以你不会阻止操作。