即使您已经在 SQL 服务器中获得了结果,来自链接服务器的查询是否仍然继续?

Does the query from the linked server still continue even though you have obtained your result in your SQL Server?

假设您有一个 link 服务器 X。

如果您要从架构(水果)的 table(苹果)中的 X 中获取 1 行。假设 table 有十亿行。

Select TOP 1 * from openquery(X , 'SELECT * FROM fruit.apples')

在后台的openquery语句中查询还在继续吗?或者一旦你得到那个结果它就会终止(SELECT TOP 1)?

不,SQLSERVER 在第一行 returned 后立即停止处理更多行..

下面是用于演示这一点的简单测试查询

select top 1* from
openquery(testserver,'select * from performancev3.dbo.orders')

执行计划显示仅扫描一行并 returned

SQLSERVER 使用迭代处理模型。因此查询执行从根(Select 运算符)开始,它向顶级运算符询问 return 一行,最后顶级运算符向其下面的语句询问一行行

这是我的测试查询和观察。

select 
--top 1 
*
from openquery(
DW,
'
select *
from visit_fact
where visit_type is not null
'
);

DW 指向一个红砖数据库。它不能很好地处理 is nullis not null。这些查询 运行 很慢。我还可以查看当前正在执行的任何查询的最后一行。

visit_fact table 有大约 650 万行。

当我 运行 上述查询时,结果立即开始在 SSMS 中返回,但底部的信息显示查询仍然是 运行ning。当我使用其他东西查看 运行ning 时,我也可以看到 where visit_type is not null。它最终在 5 分钟左右完成。

当我取消注释 top 1 时,SSMS 立即显示查询执行成功并返回一行。当我使用其他方法查看什么是 运行ning 时,我什么也看不到。