【问题标题】:How is data returned from SQL ServerSQL Server 是如何返回数据的
【发布时间】:2011-11-17 08:29:17
【问题描述】:

这可能是一个愚蠢的问题,但我试图了解当您从 SQL Server 检索数据时会发生什么。假设我们从索引视图中选择数据以消除歧义。

所以我的理解是查询优化器会将其视为表。好的,但是在调用视图和返回给客户端的实际数据之间发生的步骤是什么?数据是从 SQL Sever 中的物理文件结构中检索的,我假设在返回给调用客户端时会发生某种流式传输?中间的步骤是什么?

现在让我们比较一下直接在服务器上调用这个视图与在某个地方调用某个远程客户端。数据如何返回到远程客户端?假设这是通过 ODBC,但 SQL Server 本身是否以相同的方式返回数据而不管传输方式?那么,它会检索结果,然后将这些结果传递给客户端,还是会通过传输机制以某种方式将这些结果流回?

我希望这是有道理的。提前感谢您的任何启发! :-)

【问题讨论】:

  • 您的问题涉及很多领域。主要是数据返回客户端的方式根据您选择使用的游标而有所不同,但它也可以根据传输机制而改变。我不是这方面的专家,我知道两端都很好,但不是中间。我只知道它有效。 :)
  • 引擎中有很多东西可以传递正确的数据,因为索引构建和分析到加载预编译的视图结构;你的问题可以从一些网络工程师那里得到一个很好的答案,它可以解释数据是如何传输的、本地和远程的、协议、层和模型。这真的很有趣,但有点复杂,因为它混合了不同的领域。
  • “从索引视图中选择数据以消除歧义” 我怀疑索引视图没有按照您的想法执行。
  • 抱歉,这里提到的模棱两可部分只是为了给出一个明确的例子,而不是仅仅说我正在返回一些数据。

标签: sql-server database odbc


【解决方案1】:

当一个查询开始执行时,它最终会开始产生结果,一次一行。不管是来自表、索引视图、表构造函数表达式还是其他什么的查询都没有关系。最终将达到一个阶段,在该阶段它将准备好结果行并需要将其发送给客户端。 Tabular Datastream Protocol specifications 描述了“发送”发生的确切格式。使用的协议(套接字、网络管道、共享内存)无关紧要,所有协议下的格式都是相同的。客户端驱动都实现对TDS流的解析,然后将TDS格式的数据转换成客户端API的适当格式。如果是ODBC,那么当SQLBindCol是时,数据被移动到列绑定中指定的缓冲区中叫。 OleDB 客户端将通过DBBINDING 结构指定内存区域。托管 SqlClient 应用程序不指定绑定,因为托管内存管理不同并且回避指针,而是 SqlClient 本身将数据复制到对象中,然后在调用 SqlDataReader.GetValue 时返回这些对象。当客户满意地检查行值时,他们调用 API 的 NextRow 版本(IRowset::GetNextRowsSQLFetchSqlDataReader.Read 等),直到 API 返回“不再有行”。

这种从服务器返回到客户端的封送继续进行,直到所有行都生成并发送回。如果客户端延迟处理很长时间(卡在处理一个值并且没有调用 PAI 的NextRow 风格),那么最终transport flow control 启动并且服务器将阻塞ASYNC_NETWORK_IO 等待类型,直到客户端恢复结果的迭代并解除对传输流控制的阻塞。某种相关的讨论是Speeding up the rate that IIS/.NET/LINQ retrieves data from the Network Buffers

【讨论】:

    【解决方案2】:

    是的....

    我将使用 ODBC 来说明。 它基本上是一个“接口”。您通过 ODBC 驱动程序与 SQL Server 通信,它将 ODBC 转换为 sql server 并将 sql server 转换为 odbc,sql server 没有做任何不同的事情。

    同样地,通过 TCP/IP 或在触发器内部请求客户端 PC 上的数据不会改变查询优化器确定要做什么或如何从磁盘读取基础数据的方式。

    良好的软件设计的一个关键部分是模块化。该位与磁盘系统通信,该位进行优化,该位将数据发送到套接字。

    不要试图说明磁盘驱动器上的这些位是如何最终成为显示器上的这些像素的,除了非常困难之外,它否定了将编程作为解决问题的方法。

    【讨论】:

    • 感谢您的回复。我试图弄清楚直接返回数据与通过网络返回数据之间的性能差异。延迟最大的地方以及影响有多大。假设视图正在返回数千条记录,我们是否会在网络延迟之前开始在服务器上进行某种缓冲,因此这会使成本可以忽略不计?只是想以某种方式量化这一点。
    • 有价值但与 sql server 没有任何关系,而且它在很大程度上取决于您的网络有多忙。在服务器方面,您所能做的就是使用多少数据/频率以及您采用的方式再次取决于网络的设置方式。客户端服务器的规则之一是,如果您可以在服务器上执行此操作,请执行此操作。如果您将其最大化并希望将操作委托给客户,那么无论如何都不会是时间紧迫的。
    【解决方案3】:

    为了涵盖如何检索数据的领域,当您调用 SQL 以检索一些数据时,SQL 将首先检查您要查找的数据页是否在内存中,以加快数据的传递.如果不是,那么它将从磁盘上的数据文件中检索这些数据并将它们读回内存。从那里你的数据被呈现给客户。在视图的情况下,这是一个对象,它仅具有构建此视图的下划线 SQL 语句。因此,将执行此语句来构建视图,然后将评估您传递给视图的任何谓词并将其传递给客户端。

    对于如何将数据传递给客户端,这将取决于您的服务器是否通过 TCP/IP(这是最常见的)、命名管道、共享内存进行侦听。就 ODBC 而言,SQL 会将数据传递给 ODBC 驱动程序,并将数据封装在 TCP/IP 数据包中,然后通过您连接的任何端口(SQL 默认为 1433)传递给客户端。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2013-02-11
      • 2019-08-23
      • 2010-12-19
      • 2021-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多