gpt4 book ai didi

sql-server - SQL Server 返回数据的方式

转载 作者:搜寻专家 更新时间:2023-10-30 23:19:37 24 4
gpt4 key购买 nike

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

所以我的理解是查询优化器将把它当作一个表来对待。好的,但是在调用该 View 和返回客户端的实际数据之间发生的步骤是什么?数据是从 SQL Sever 中的物理文件结构中检索的,我假设在返回到调用客户端时会发生某种流式传输?中间有哪些步骤?

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

我希望这是有道理的。在此先感谢您的启发! :-)

最佳答案

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

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

关于sql-server - SQL Server 返回数据的方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8156586/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com