我有一个SQL Server SP,想对大约一千万个用户记录集执行该命令,以处理用户信息并更新数据库。当前1位用户在DB中更新需要花费几毫秒的时间。既然如此,它必须处理数百万条记录的最佳方法是什么?
我正在考虑使用多线程或并行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();
如何使用它在多线程模式下运行以更快地完成处理工作?
Parallel.ForEach()是实现目标的非常合理的起点。到目前为止,向SQL Server发送并发请求可以提高整体吞吐量。
将您的代码放入Parallel.ForEach()的操作中。使用using语句可确保正确处理所有内容(如果在关闭前引发异常,则现在将使连接保持打开状态)。
请注意,.NET Framework将尝试找到最佳数量的线程(并且该框架的不同版本最终可能会选择不同的线程)。.NET可能会选择多个线程
请注意,尽管多线程解决方案可能比单线程解决方案更有效,但仍然非常闲谈。它向数据库请求每个用户记录。在这种情况下,我通过将一批工作发送到SQL Server而不是一个工作项,从而实现了按数量级的性能改进。通过重新设计存储过程以一次接受多个用户,您可能会看到最大的收获。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句