ADO.NET SQL Server性能:多个结果集与多个命令执行

时间:2010-11-10 17:58:06

标签: c# .net sql-server tsql ado.net

使用连接池或至少假设连接在调用之间没有关闭,是否存在网络或服务器性能差异以及一个存储过程执行与多个结果集和多个存储过程执行之间的重要性。

在伪代码中,类似

using(new connection)
{
  using (datareader dr = connection.Execute(Command))
  {
    while (dr.NextResult())
    {
      while (dr.Read())
      {
        SomeContainer.Add(Something.Parse(dr));
      }
    }
  }
}

VS

using(new connection)
{
  using (datareader dr = connection.Execute(Command))
  {
    while (dr.Read())
    {
      SomeContainer.Add(Something.Parse(dr));
    }
  }

  using (datareader dr = connection.Execute(Command))
  {
    while (dr.Read())
    {
      SomeContainer.Add(Something.Parse(dr));
    }
  }
}

4 个答案:

答案 0 :(得分:4)

第一个是到服务器的单程往返,第二个是不同的往返。由于网络延迟,解析请求的时间,设置执行上下文的时间等原因,往返会发生惩罚。然而,除了最关键的应用程序之外,这种惩罚几乎可以忽略不计。

所以做任何更容易理解,编码,调试和维护(imho,这将是第二个选项)。你可能无法衡量差异。

答案 1 :(得分:1)

我不同意,我几乎总是会使用第一种方法(它实际上取决于特定的场景)但总的来说,最好让proc返回2个结果集,而不是2次调用2个不同的procs返回由于@Remus解释的原因(网络延迟等)精确地设置单个数据集。

在大多数情况下,差异不可忽略。

答案 2 :(得分:0)

建议您自己介绍一下这些差异。什么是最有效的可能在很大程度上取决于有多少数据和多少用户等。我倾向于认为通过网络的一次往返更好,但最好尝试两种方法和衡量,然后你就会知道。 / p>

答案 3 :(得分:-1)

您可以假设在两个场景中都使用了连接池,因此这在确定效率时确实是一个非因素。

如果您可以在一次通话中收到所有结果,那么它自然比多次通话更有效。考虑一个简单的例子,即单独选择10件事,而选择所有10件事同时使用“in”子句。这是发送到服务器的1个查询,解析了1个响应,每个10个。这是Remus正在谈论的往返。

在轻度使用场景中,它很可能是名义上的,但随着(如果)你扩展,可能会开始出现问题。您的连接池有一个限制,可以在某个时候达到。

如果您在呼叫之间返回相同类型的数据,我会使用选项1。

但是,还需要考虑维护和重用。如果您要返回不同的数据(即:获取特定视图所需的所有数据),我会使用选项2并根据需要优化到更少的调用。