运行程序的多个实例以加快进程?

时间:2013-11-29 19:07:28

标签: c# performance optimization concurrency parallel-processing

我有一个执行长时间运行过程的程序。循环遍历数千条记录,一次一个,并在每次迭代时调用存储过程。运行这样的程序的两个实例,其中一个处理一半记录而另一个处理另一半加速处理?

以下是方案:

  1. 1个程序,运行长时间运行的进程
  2. 同一服务器上的2个程序实例,连接到同一个数据库,每个负责处理一半(50%)记录。
  3. 2个实例在不同的服务器上,连接到同一个数据库,每个负责一半(50%)的记录。
  4. 方案2或3的运行速度是1的两倍吗? 2和3之间会有区别吗?主要的瓶颈是存储过程调用大约需要半秒钟。

    谢谢!

2 个答案:

答案 0 :(得分:4)

这取决于很多因素。另请注意,线程可能比进程更合适。或者可能不是。再说一遍:这取决于。但是:这是CPU工作的吗?网络绑定?或者受数据库服务器的限制?添加并发性有助于CPU绑定,以及与多个独立资源进行通信时。在相同的网络连接或相同的数据库服务器上进行战斗不太可能改善事情 - 并且可能会使事情变得更糟。

坦率地说,从它的声音来看,你最好的选择可能是重新开始分组工作(而不是个人记录)。

要正确回答这个问题,您需要知道当前我们的数据库服务器的资源利用率:是否需要额外负载?或者更简单 - 只需尝试并查看

答案 1 :(得分:1)

这实际上取决于存储过程正在做什么。如果存储过程将要更新记录,并且您有一个数据库实例,则在写回数据时会发生争用。

这里的值是:

  1. 将数据读入应用程序内存所需的时间(这也取决于您使用的是客户端还是sql-server端游标)。
  2. 处理或执行应用程序逻辑所需的时间。
  3. 返回更新项目所需的时间(假设proc更新)。
  4. 一个解决方案(这绝不是一个完美的解决方案,不知道确切的要求),是:

    1. 让X服务器读取Y记录并进行处理。
    2. 让这些服务器以序列化方式将结果写回专用写入服务器,以避免争用。