我有一个 SQL Server SP,希望对大约 1000 万个用户记录集执行该 SP,以处理用户信息并更新数据库。目前,1 个用户在数据库中更新需要几毫秒。既然它必须处理数百万条记录,那么最好的方法是什么?
我正在考虑使用多线程或并行 foreach 从 C# 应用程序中执行此操作。下面是运行SP的基本代码,如何使用它以多线程模式运行它以更快地完成处理工作?
string connString = "data source=.\SQLEXPRESS;initial catalog=Test;integrated security=True;";
SqlConnection conn = new SqlConnection(connString);
conn.Open();
SqlCommand cmd = new SqlCommand("ETL_TEST", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new SqlParameter("@user_id", '12345'));
cmd.ExecuteReader();
conn.Close();
最佳答案
how can I use it to run it in multithreaded mode to do the processing job faster?
Parallel.ForEach() 是实现您的目标的一个非常合理的起点。 Up to a point ,向SQL Server发送并发请求可以提高整体吞吐量。
将代码放入 Parallel.ForEach() 的操作中。使用using statements确保事情得到正确处理(现在,如果在关闭之前抛出异常,您将使连接保持打开状态)。
请注意,.NET Framework 将尝试找到最佳线程数(不同版本的框架可能最终会选择不同的数字)。 .NET 可能会选择多个线程,这些线程是
- 太低(您无法影响,但可以通过显式创建和管理任务来解决)
- 太高,导致 SQL Server 执行效率低下(由于 IO 或锁争用、CPU 高等)。在这种情况下,您可以使用MaxDegreeOfParallelism属性来限制线程数量。如果您迁移到功能或多或少的 SQL Server,请不要忘记调整该属性。
请注意,多线程解决方案虽然可能比单线程解决方案更高效,但仍然很麻烦。它向数据库发出每个用户记录的请求。在这种情况下,我通过将一批工作而不是单个工作项发送到 SQL Server,实现了数量级的性能改进。通过重新设计存储过程以同时接受多个用户,您可能会看到最大的 yield 。
关于C# 使用多线程或并行执行执行 SQL SP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35468524/