如何使用100个记录和100个并发用户优化数据导入SQL Server

时间:2017-08-26 10:35:45

标签: sql-server asp.net-mvc sqlbulkcopy

我正在使用ASP.NET MVC和Visual Studio Web应用程序。 C#。我有一个超过100000条记录的Excel文件,可以导入到SQL Server 2008 R2中。

我已将SqlBulkCopy与ado.net DataTable一起用于将数据复制到表格(Table1)。

然后验证和处理数据并使用有效/无效标记。

然后使用存储过程从Table2向3个表(Table3Table4Table1)添加和更新记录。

Table4包含2个触发器,它使用游标在Table4和另一个表(Table2)内更新与其相关的多个记录。

测试时,我的本地计算机使用调试模式需要1分钟来处理10000条记录。

如果10个或100个用户同时导入,它会支持吗?

是否有更好的流程来改善和支持许多并发用户?

我的电脑配置:

  • Windows 10 64Bit
  • AMD FX QuardCore 3.6 GHz处理器
  • 8GB RAM

  • Excel文件包含50列

  • BulkCopy需要2 - 3秒
  • 存储过程需要30秒到2分钟

当我用5个并发用户测试它时,2或3个进程成功执行,我收到此错误:

  

事务(进程ID 66)在锁定时死锁与另一个进程通信缓冲资源并被选为死锁牺牲品。重新运行该交易。

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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中的触发器不适用于预先存在的数据,请单独处理并将MERGE分成主表2,表3,表4。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

不对查询添加锁定,因此您不会阻止操作。