Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ADO.NET SQL Server性能:多个结果集与多个命令执行_C#_.net_Sql Server_Tsql_Ado.net - Fatal编程技术网

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

C# ADO.NET SQL Server性能:多个结果集与多个命令执行,c#,.net,sql-server,tsql,ado.net,C#,.net,Sql Server,Tsql,Ado.net,使用连接池或至少假设调用之间的连接未关闭,是否存在网络或服务器性能差异,以及一个具有多个结果集的存储过程执行与多个存储过程执行之间的差异有多大 在伪代码中,类似 using(new connection) { using (datareader dr = connection.Execute(Command)) { while (dr.NextResult()) { while (dr.Read()) { SomeContainer

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

在伪代码中,类似

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


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


因此,做任何更容易理解、编码、调试和维护的事情(imho,这将是第二种选择)。您可能无法测量差异。

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


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

建议您自己分析差异。什么是最有效的可能在很大程度上取决于有多少数据和多少用户等。我倾向于相信通过网络往返一次更好,但最好尝试这两种方法和测量,然后您就会知道。

您可以假设连接池在两种情况下都被使用,因此,这实际上不是决定效率的一个因素

如果您可以在一个调用中接收所有结果,那么它自然比多个调用更有效。考虑一个简单的情况,选择10个单独的事物,而不是同时选择一个“in”子句10个。这是发送到服务器的1个查询和解析的1个响应,而每一个都是10个响应。这就是雷姆斯所说的往返旅行

在轻量使用的情况下,这很可能是名义上的,但如果你扩大规模,聊天可能开始成为一个问题。您的连接池有一个在某个点可以达到的限制

如果在两次调用之间返回相同类型的数据,我会选择选项1


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

我想,第一个应该更快(对象创建计数更少)。尝试创建一个测试来测量时间。所以即使连接保持打开状态,它也会创建一个新的往返?你说这是在噪音中,但是如果我们谈论的是一个web上下文,其中每3或4分钟可能有1000个对该块的调用,并且说它是10或15个结果集而不是2个,那么噪音会变得显著还是完全最小?每个
Execute
都是一个往返过程:请求必须发送到服务器,服务器必须创建一个任务来处理它,该任务必须选择一个工作进程来运行,一旦启动,就必须对其进行解析,然后启动执行。我仍然会说,所有这些加起来的噪音最小。在每~3分钟~1k的情况下,您所说的是每秒70-100次,而不是10-15次请求。如果你的客户在香港,你的服务器在欧洲,那么往返显然是更重要的。那么其他SQL Server客户端、监控等呢?如果网络延迟很明显,那么往返损失至少与延迟一样大。但是,随着客户在海外运行,我会考虑重新使用本地数据服务器,并使用可靠的传递机制来推动数据跨越大陆。不是出于性能的原因,而是出于可用性的原因。我测试了这两个选项,因为我有相同的问题。结果是,多个调用与具有多个结果集的单个调用相比,速度要慢大约3倍(在我使用池连接的测试环境中)。因此,在性能方面使用多个结果集。
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));
    }
  }
}