SQL Server 链接服务器性能:为什么远程查询如此昂贵?

vst*_*ien 16 sql-server sql-server-2008-r2 linked-server except

我有两个数据库服务器,通过链接服务器连接。两者都是 SQL Server 2008R2 数据库,链接服务器连接是通过常规“SQL Server”链接使用当前登录的安全上下文建立的。链接的服务器都在同一个数据中心,所以连接应该不是问题。

我使用以下查询来检查列的哪些值identifier可远程使用,但不能在本地使用。

SELECT 
    identifier 
FROM LinkedServer.RemoteDb.schema.[TableName]

EXCEPT

SELECT DISTINCT
    identifier 
FROM LocalDb.schema.[TableName] 
Run Code Online (Sandbox Code Playgroud)

在两个表上的列上都有非聚集索引identifier。本地大约有 260 万行,远程只有 54 行。然而,在查看查询计划时,70% 的执行时间用于“执行远程查询”。此外,在研究完整的查询计划时,估计的本地行数是1而不是2695380(这是仅选择后面的查询时的估计行数EXCEPT)。 执行计划 执行此查询时,确实需要很长时间。

不禁让人疑惑:这是为什么呢?估计是“刚刚”结束,还是链接服务器上的远程查询真的那么昂贵?

Mar*_*ith 10

你目前的计划在我看来是最理想的计划。

我不同意其他答案中的断言,即它将 2.6M 行发送到远程服务器。

在我看来,该计划好像对于从远程查询返回的 54 行中的每一行,它正在对本地表执行索引查找,以确定它是否匹配。这几乎是最佳计划。

考虑到表的大小,用散列连接或合并连接替换会适得其反,而添加中间#temp表只会增加一个似乎不会给您带来任何好处的附加步骤。


Ode*_*ded 6

连接到远程资源是昂贵的。时期。

任何编程环境中最昂贵的操作之一是网络 IO(尽管磁盘 IO 往往使其相形见绌)。

这扩展到远程链接服务器。调用远程链接服务器的服务器需要先建立连接,然后需要在远程服务器上执行查询,返回结果并关闭连接。这一切都需要时间通过网络。


您还应该以这样一种方式构建您的查询,即通过网络传输最少的数据。不要指望数据库会为您优化。

如果我要编写此查询,我会将远程数据选择到表变量(或临时表)中,然后将其与本地表结合使用。这确保只有需要传输的数据才会传输。

您正在运行的查询可以轻松地将 260 万行发送到远程服务器以处理该EXCEPT子句。

  • 你从哪里推断出它从远程服务器发送 2.6M 行的事实?我对远程查询运算符的计划没有太多经验,但看起来好像 54 行来自远程查询运算符,然后它正在对本地表执行反半联接。 (2认同)
  • @Lieven - 可能是合乎逻辑的,但从所示的计划来看,这并不正确。 (2认同)