链接服务器查询在哪里执行?

inf*_*dba 8 sql-server linked-server distributed-transactions openrowset distributed-queries

我有两个实例ServerAServerB,并且我在ServerA 中ServerB创建了一个链接服务器作为Linksrv_B

我可以使用四部分命名约定在ServerA上执行查询:

SELECT * FROM Linksrv_B.master.sys.databases
Run Code Online (Sandbox Code Playgroud)

OPENQUERY()

SELECT * FROM OPENQUERY(Linksrv_B, 'SELECT * FROM master.sys.databases')  
Run Code Online (Sandbox Code Playgroud)

我知道链接服务器使用分布式事务作为行集跨异构数据库工作。

  1. OLEDB 提供程序在哪里启动/连接?服务器A还是服务器B?
  2. 查询是在 ServerA 还是 ServerB 上执行的?优化器是否在哪个服务器上发挥作用?
  3. 结果集在哪里缓存?
  4. 谁能给我们一个详细的解释链接服务器是如何工作的。

Jon*_*ite 5

1 - OLEDB 提供程序在服务器 A 上启动,服务器 B 将其视为正常连接和查询,它不知道服务器 A 是 SQL Server,它只是它的客户端。

2 - 查询在两者上执行。服务器 A 将查询传递给执行它的服务器 B,然后服务器 A 处理结果。优化器在两者上都起作用,但不能与其他服务器通信。

给定一个不复杂的查询,性能将是等效的。但是,当您开始处理复杂的查询或大型数据集时,通过将您需要的内容从服务器 B 提取到临时表中,然后将其与服务器 A 上包含的数据一起使用,您将看到性能提升。(假设您需要混合和跨服务器匹配数据)。本质上,使用 OPENQUERY 语法,您将查询作为一个整体传递给服务器 B(希望包含一个 where 子句),然后服务器 B 将数据返回给 Serer A。使用四部分命名,您无法控制,优化器很快就会决定从服务器 B 获取表中的所有数据,然后根据其他条件(连接、位置等)进行删除。

3 - 结果未缓存(除非 SQL 正常缓存数据)。除非您将链接服务器查询的结果存储到某个地方的临时表中。

4 - 如果您熟悉应用程序如何连接到数据库并执行查询,那么该过程非常相似。除了身份验证差异之外,它是相同的,只是它允许轻松地将来自多个服务器的数据混合和匹配到单个结果集中。但是您的性能将在很大程度上取决于从服务器 B 中提取的数据量,并始终了解优化器阻止您从服务器 B 中提取整个表的有限能力,即使您最终只需要其中 5 行。