C# 使用多线程或并行执行执行 SQL SP

标签 c# sql .net sql-server multithreading

我有一个 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/

相关文章:

c# - 从 PowerShell cmdlet 返回对象

php - MySQL 查找两个表之间的库存水平差异并返回结果

c# - .NET 计时器不准确?

sql - 返回当前的 SSIS 错误计数

sql - SQL Server 中的逆透视表

c# - C# 中是否有 <key, value, value> 字典类型?

c# - 使用异步套接字的 TCP 端口转发

C# 自定义脚本语言

c# - 在 net core 控制台应用程序中使用 Web 服务器进行简单路由

c# - 当弹出窗口打开时,单击 Windows 标题栏的最小化、最大化和关闭按钮不起作用