C# SQL Server 2008--并行执行查询

C# SQL Server 2008--并行执行查询,c#,sql,sql-server,sql-server-2008,C#,Sql,Sql Server,Sql Server 2008,有没有一种简单的并行执行查询的方法?我有一个类似这样的查询: delete from TableA where id = @id delete from TableB where id = @id delete from TableC where id = @id ... 我想同时做这些。我也可以使用C#,但不确定如何使用。第一个想法是使用单独的线程和单独的连接,但我认为您可以使用异步回调在单个线程中使用多个连接来管理它: string[] tables = new string[] { "T

有没有一种简单的并行执行查询的方法?我有一个类似这样的查询:

delete from TableA where id = @id
delete from TableB where id = @id
delete from TableC where id = @id
...

我想同时做这些。我也可以使用C#,但不确定如何使用。

第一个想法是使用单独的线程和单独的连接,但我认为您可以使用异步回调在单个线程中使用多个连接来管理它:

string[] tables = new string[] { "TableA", "TableB", "TableC" ... };
var runningCommands = new List<SqlCommand>();
foreach(var table in tables)
{
  var conn = new SqlConnection(...);
  conn.Open();
  var cmd = new SqlCommand("DELETE FROM " + table + " WHERE id = @id");
  cmd.Parameters.Add(new SqlParameter("@id", id);
  cmd.BeginExecuteNonQuery(); 
  runningCommands.Add(cmd);
}
// now wait for all of them to finish executing
foreach(var cmd in runningCommands)
{
  cmd.EndExecuteNonQuery();
  cmd.Connection.Close();
}
string[]tables=新字符串[]{“TableA”、“TableB”、“TableC”…};
var runningCommands=new List();
foreach(表中的var表)
{
var conn=新的SqlConnection(…);
conn.Open();
var cmd=new SqlCommand(“从“+table+”中删除,其中id=@id”);
cmd.Parameters.Add(新的SqlParameter(“@id”,id);
cmd.beginexecutenquery();
runningCommands.Add(cmd);
}
//现在等待它们全部完成执行
foreach(runningCommands中的var cmd)
{
cmd.endexecutenonquiry();
cmd.Connection.Close();
}

第一个想法是拥有独立的线程和独立的连接,但我认为您可以使用异步回调在单个线程中使用多个连接来管理它:

string[] tables = new string[] { "TableA", "TableB", "TableC" ... };
var runningCommands = new List<SqlCommand>();
foreach(var table in tables)
{
  var conn = new SqlConnection(...);
  conn.Open();
  var cmd = new SqlCommand("DELETE FROM " + table + " WHERE id = @id");
  cmd.Parameters.Add(new SqlParameter("@id", id);
  cmd.BeginExecuteNonQuery(); 
  runningCommands.Add(cmd);
}
// now wait for all of them to finish executing
foreach(var cmd in runningCommands)
{
  cmd.EndExecuteNonQuery();
  cmd.Connection.Close();
}
string[]tables=新字符串[]{“TableA”、“TableB”、“TableC”…};
var runningCommands=new List();
foreach(表中的var表)
{
var conn=新的SqlConnection(…);
conn.Open();
var cmd=new SqlCommand(“从“+table+”中删除,其中id=@id”);
cmd.Parameters.Add(新的SqlParameter(“@id”,id);
cmd.beginexecutenquery();
runningCommands.Add(cmd);
}
//现在等待它们全部完成执行
foreach(runningCommands中的var cmd)
{
cmd.endexecutenonquiry();
cmd.Connection.Close();
}

使用SSI。将3个执行sql任务放在控制流上。为每个任务添加delete语句。当包执行时,它们将同时执行

您还可以为每个语句创建一个作业,并安排它们同时运行


异步回调也可以工作,但对于拥有dba技能的人来说,上面2项更容易实现和管理。

使用SSIS。在控制流上放置3个执行sql任务。为每个任务添加一个delete语句。当包执行时,它们将同时执行

    List<string> list;
    list.Add("query1");
    list.Add("query2");
    list.AsParallel().ForAll(query => ExecuteQuery(query));
您还可以为每个语句创建一个作业,并安排它们同时运行

异步回调也可以工作,但对于拥有dba技能的人来说,上述2项更容易实现和管理。

List;
    List<string> list;
    list.Add("query1");
    list.Add("query2");
    list.AsParallel().ForAll(query => ExecuteQuery(query));
列表。添加(“查询1”); 列表。添加(“查询2”); ForAll(query=>ExecuteQuery(query));
列表;
列表。添加(“查询1”);
列表。添加(“查询2”);
ForAll(query=>ExecuteQuery(query));

请注意,如果这些表之间有外键关系,则性能可能不如您想象的那样好。是的,除了主表之外,所有这些表都是独立的,我将最后一次这样做。从三个表中按id删除一些行是否真的是一个性能问题,是否值得通过并行处理使代码复杂化?请注意,如果ose表之间有外键关系。它的性能可能不如您想象的那么好。是的,除了主表之外,所有这些表都是独立的,我最后要做的是主表。从三个表中按id删除一些行,这真的是一个性能问题吗?是否值得通过并行处理使代码复杂化?并行化并不重要-请求仍在数据库中按顺序执行。这就是为什么您要使用事务日志还原到特定时间点的原因。如果.NET 1.1已经三年不受支持,这可能有助于您的升级:@OMGPonies只有DB写入操作被序列化。删除查询不止这些(解析查询,在DB中找到正确的记录)。您至少可以从中受益。写入查询也不会序列化。两个并发查询都可以写入内存中的不同页面。在成功提交之前,它们需要等待最后一个LSN写入日志文件。还原到特定时间点只意味着还原到在某个时间点提交的事务该时间点。@ssg-日志文件总是按顺序写入,但这与特定的用户事务无关。也就是说,它们只是独立地进行工作,并且在事务提交之前,必须至少刷新到事务的最后一个LSN。并行化并不重要-请求在数据库中仍然按顺序执行。这就是为什么您要使用事务日志还原到特定时间点。如果.NET 1.1已经三年不受支持,这可能有助于您的升级:@OMGPonies只有DB写入操作是序列化的。删除查询不止于此(解析查询,在DB中找到正确的记录)。您至少可以从中受益。写入查询也不会序列化。两个并发查询都可以写入内存中的不同页面。在成功提交之前,它们需要等待最后一个LSN写入日志文件。还原到特定时间点只意味着还原到在某个时间点提交的事务该时间点。@ssg-日志文件总是按顺序写入,但这与特定的用户事务无关。即,它们只是独立地进行工作,并且在事务提交之前,必须至少刷新到事务的最后一个LSN。