如何从SQL Server返回数据

时间:2011-11-16 18:14:57

标签: sql-server database odbc

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

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

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

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

3 个答案:

答案 0 :(得分:2)

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

从服务器返回到客户端的这种编组继续,直到生成所有行并将其发回。如果客户端延迟处理很长时间(停留在处理值并且没有调用PAI的NextRow风味),那么最终SqlDataReader.Read会启动并且服务器将阻塞{{3}等待类型,直到客户端恢复结果的迭代并取消阻止传输流控制。某种相关的讨论是transport flow control

答案 1 :(得分:0)

是....

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

通过TCP / IP或触发器内部同样询问客户端PC上的数据并不会改变查询优化器如何确定要执行的操作或如何从磁盘读取基础数据。

良好的软件设计的关键部分是模块化。这个位与磁盘系统对话,这个位优化,这个位在套接字下发送数据。

不要尝试将该磁盘驱动器上的这些位最终作为这个监视器上的这些像素进行关联,除了难以理解之外,它会将编程作为一种解决问题的方法。

答案 2 :(得分:0)

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

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

希望这有帮助。