查询在哪个服务器上执行?

luk*_*fer 2 execution-plan sql-server-2012 distributed-transactions

给定两个 Microsoft SQL 服务器:

假设ServerA有一个名为“View1”的视图: SELECT * FROM ServerB.database.dbo.Table1 WHERE Column1 IN (1,2,3)

和一个存储过程“sp_Foo”: SELECT * FROM View1 WHERE Column1=1

当我执行时EXEC sp_Foo,哪个查询在哪个服务器上执行?都是在ServerB上执行的吗?都在 ServerA 上?还是在ServerB上执行的视图查询和在ServerA上执行的SP查询?

Rem*_*anu 5

sp_foo执行只有一个查询:

SELECT * 
FROM (
  SELECT * 
  FROM ServerB.database.dbo.Table1 
  WHERE Column1 IN (1,2,3))
WHERE Column1=1;
Run Code Online (Sandbox Code Playgroud)

此查询可以针对远程扫描在本地执行,也可以远程执行。无法预测会发生什么,因为这取决于链接服务器正在使用的驱动程序通告的功能。通常,在使用 SQLNCLI 驱动程序的链接服务器上的上述查询将远程执行。由远程扫描支持的本地执行在执行计划中显示为Remote Scan Showplan operator

更复杂的计划可以以某种方式混合执行,部分远程部分本地,例如。请参阅用于 JOIN 子句时的链接服务器行为