0

我想在一个线程/并行上执行一个具有 2 个输入参数多次(比如 100 次)的 SP。我添加了异步处理=真;MultipleActiveResultSets=true 在我的连接字符串中并使用以下代码执行 SP

在按钮_单击

// ExecuteSPList 是一个具有 100 个 ReportID 的列表,在单击按钮时,我正在创建线程 100 次,该线程正在调用 CallInvokeUpdate

           Parallel.ForEach(ExecuteSPList, itm =>
            {
                CallInvokeUpdate(itm.ToString());
            });

然后在 CallInvoke 中:

   public void CallInvokeUpdate(string str)
   {
       ExecuteSP(str, strSelectedMonthEndDate);
   }

最后是 ExecuteSP 方法。

   public string ExecuteSP(string ReportId)
   {
       try
       {
           string connectionString = ConfigurationManager.ConnectionStrings["DB"].ConnectionString;               

           DataSet ds = new DataSet();

           using (SqlConnection sqlConnection = new SqlConnection(connectionString))
           {
               SqlCommand cmd = new SqlCommand("UpdateExecuteSP", sqlConnection);
               sqlConnection.Open();
               cmd.CommandTimeout = 3000000;

               addParameter(cmd, "ReportId", ReportId, SqlDbType.Int);

               cmd.CommandType = CommandType.StoredProcedure;

               IAsyncResult result = cmd.BeginExecuteNonQuery();
               cmd.EndExecuteNonQuery(result);
           }
           return "OK";
       }

       catch (Exception ex)
       {
           throw;
       }
   }

   private void addParameter(SqlCommand cmd, string name, object value, SqlDbType type)
   {

       SqlParameter parameter = new SqlParameter(name, type);

       cmd.Parameters.Add(parameter);

       parameter.Value = value;
   }

我的问题是,如果一个 ReportId 执行存储过程“UpdateExecuteSP”需要 5 秒,那么使用这种方法也需要大约 100*5 = 500 秒。

任何人都可以建议如何减少此时间并并行运行 SP 100 次。任何执行之间都没有依赖关系。

有什么建议吗?

4

1 回答 1

0

Since the problem is locking tables, to execute SP's in parallel you will need to change the Isolation level in your SPs.

One way to do this is like this:

.....
FROM dbo.TableName with (nolock)
.....

Note, that this can lead to unexpected behavior, but I think that as long as no 2 parallel queries modify the same rows it should be good. Please read this thread to learn more about the method

When to use with (nolock)

于 2013-07-31T10:31:50.190 回答