如何优化数据导入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个表(Table2
,Table3
和Table4
)。
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.
您可以在导入过程中禁用(或者可能会删除并重新创建)索引吗?索引紧固选择,但减慢插入和更新大型表?使用MERGE代替INSERT和UPDATE。
查找游标的替代方法(如CTE或while循环或MERGE语句)或使用FAST_FORWARD游标(如果尚未使用)。
您如何验证数据。这一步足够快吗?
在批量处理过程中是否需要触发器?这些表是从哪里使用的。每行都会执行的触发器代码,您可以在批量导入过程中批量执行该代码。在Sql中有一个DISABLE触发器的选项。检查是否适合您的目的。
SSIS包也可以导入数据和做这样的事情。
您可以创建table2_temp,table3_temp,table4_temp(可能是每个用户动态地拖放它们)。如果表4中的触发器不适用于预先存在的数据,则分别进行处理并将其合并到主表2,表3,表4中。
添加锁定查询,所以你不会阻止操作。
看来你的问题是关于存储过程的性能和并发性。添加DDL(包括索引)以及proc和触发代码到您的问题。通常,游标对性能不利,将触发器代码移动到proc可能会更好。 –
导入中有很多部分。确定哪个部分花费的时间最长。我总是怀疑游标。 –
我试过禁用触发器,但没有成功。 – Debashis