我正在使用ASP.NET MVC和Visual Studio Web应用程序。 C#。我有一个超过100000条记录的Excel文件,可以导入到SQL Server 2008 R2中。
我已将SqlBulkCopy
与ado.net DataTable
一起用于将数据复制到表格(Table1
)。
然后验证和处理数据并使用有效/无效标记。
然后使用存储过程从Table2
向3个表(Table3
,Table4
和Table1
)添加和更新记录。
Table4
包含2个触发器,它使用游标在Table4
和另一个表(Table2
)内更新与其相关的多个记录。
测试时,我的本地计算机使用调试模式需要1分钟来处理10000条记录。
如果10个或100个用户同时导入,它会支持吗?
是否有更好的流程来改善和支持许多并发用户?
我的电脑配置:
8GB RAM
Excel文件包含50列
当我用5个并发用户测试它时,2或3个进程成功执行,我收到此错误:
事务(进程ID 66)在锁定时死锁与另一个进程通信缓冲资源并被选为死锁牺牲品。重新运行该交易。
答案 0 :(得分:2)
看看&试试Zzz Project,你可以在几秒钟内批量插入一百万条记录。 它支持实体框架,Dapper。 ZZZProject
答案 1 :(得分:2)
您可以在导入期间禁用(或者可能,删除并重新创建)索引吗?索引会固定选择但会减慢大型表的插入和更新速度吗?使用MERGE而不是INSERT和UPDATE。
找到游标的替代方法(如CTE或while循环或MERGE语句)或使用FAST_FORWARD游标(如果尚未使用)。
您如何验证数据?这一步足够快了吗?
批量处理期间是否需要触发器?这些表是从某个地方使用的吗?每行将执行的触发器代码,您可以批量导入过程中批量执行该操作。在Sql中有一个DISABLE触发器选项。请检查是否符合您的目的。
SSIS包也可以导入数据并执行此类操作。
您可以创建table2_temp,table3_temp,table4_temp(可以是每个用户动态并稍后删除它们)。如果表4中的触发器不适用于预先存在的数据,请单独处理并将MERGE分成主表2,表3,表4。
答案 2 :(得分:1)
将此记录插入或导入新表或临时表以及稍后或复制/移动到目标表。
答案 3 :(得分:1)
不对查询添加锁定,因此您不会阻止操作。