2011-11-16 76 views
1

这可能是一个愚蠢的问题,但我试图了解当从SQL Server中检索数据时在封面下发生了什么。假设我们从索引视图中选择数据以消除模糊性。如何从SQL Server返回数据

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

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

我希望这是有道理的。预先感谢任何启示! :-)

+1

你的问题有很多领域,它涵盖。数据返回客户端的方式主要取决于您选择使用的游标,但它也可以基于传输机制进行更改。我不是这方面的专家,我知道两方面都相当好,但不是中等。我只知道它的工作原理。 :) –

+0

引擎中有很多东西可以提供正确的数据,因为索引构建和分析可以加载预编译的视图结构;你的问题可以从网络工程师那里得到很好的答案,它可以解释数据如何传输,本地和远程,协议,层和模型。这非常有趣,但有点复杂,因为它混合了不同的领域。 – Hamikzo

+0

“从索引视图中选择数据以消除歧义”我怀疑索引视图没有做到你认为它正在做的事。 – Hogan

回答

0

是的......

我会用ODBC来说明。它基本上是一个'界面'。你通过一个ODBC驱动程序与SQL服务器通信,它将ODBC转换为SQL服务器并将sql服务器转换为odbc,sql服务器不会做任何不同的事情。

同样要求你的数据通过TCP/IP客户端PC上或触发器内不会改变查询优化器是如何计算出做什么或如何底层的数据从磁盘中读取。

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

不要尝试,并涉及该磁盘驱动器上的这些位是如何被该死的困难最终成为这个显示器上这些像素,放在一边,它否定编程作为一个解决问题的方法。

+0

感谢您的回复。我试图找出直接返回数据与通过网络返回数据之间的性能差异。延迟时间最长以及影响程度如何。假设该视图返回了数千条记录,我们是否会开始在服务器上获得某种类型的缓存,然后再等待网络上的延迟,因此这会使成本变得微不足道?只是试图量化这一些如何。 –

+0

宝贵的但并非真正与SQL Server有关的事情,它也将严重依赖于你的网络繁忙程度。服务器方面,你所能做的就是玩多少数据/多少次以及你走哪条路,这又取决于网络的建立方式。规则客户端服务器之一是,如果你可以在服务器上这样做。如果你正在尽力而为,并且希望将操作委托给客户端,那么无论如何它都不是时间关键。 –

0

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

对于如何将数据传送到客户端,这将取决于如果服务器监听通过TCP/IP(这是最常见的),命名管道,共享内存。在ODBC方面,SQL将把数据传递给ODBC驱动程序,并将数据封装在TCP/IP数据包中,并将其传送到客户端,无论您连接的是何种端口(SQL默认为1433)。

希望这会有所帮助。

2

当一个查询被发射到执行它最终将开始产生效果,一次一行。无论是从表,从索引视图,从表构造器表达式或其他任何查询。最终将达到一个阶段,它将准备好结果行,并且需要将其发送给客户端。 Tabular Datastream Protocol specifications描述了“发送”发生的格式。使用的协议(套接字,网管,共享内存)无关紧要,所有协议下的格式都是一样的。客户端驱动程序全部实现TDS流的解析,然后将TDS格式的数据转换为适当格式的客户端API。如果是ODBC,则当调用SQLBindCol时,数据将移动到列绑定中指定的缓冲区中。 OleDB客户端将通过DBBINDING结构指定内存区域。受管理的SqlClient应用程序没有指定绑定,因为管理的内存管理不同,并且避开指针,而是SqlClient自身将数据复制到对象中,然后在调用SqlDataReader.GetValue时返回对象。由于客户满意地检查行值,他们称之为API的版本NextRowIRowset::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

相关问题