链接服务器查询需要很长时间,除非过滤器是硬编码的

时间:2017-01-24 19:03:26

标签: sql-server performance linked-server

我有一个简单的选择查询,我正在执行如下:

SELECT Id FROM [LinkedServer].[Catalog].[dbo].[someTable] WHERE date = @someDate AND Id IN (SELECT Id FROM ids)

ids是一个单列表,其中包含50个左右的ID列表(FWIW,ID都是字符串,而不是整数),而LinkedServer是跨大西洋的服务器。 someTable是许多(~300m)(date,ID)对与值的映射,并具有相应的PK。

我无法理解的奇怪之处在于此查询需要10秒才能执行 - 但是如果我用ids的硬编码内容替换(SELECT Id FROM ids),那么查询会读取

SELECT Id FROM [LinkedServer].[Catalog].[dbo].[someTable] WHERE date = @someDate AND Id IN ('id1','id2', ..., 'id50')

说,它在< 1s中执行。任何人都可以解释这种差异,并提出任何想法,如何将硬编码查询的性能延续到真正的查询中吗?

1 个答案:

答案 0 :(得分:1)

第一个查询在两台服务器上以分布式方式运行。这可能很慢,因为服务器A不知道服务器B的统计信息,并且无法生成正确的执行计划。

第二个查询“将”查询“传输”到服务器B,然后查询在服务器B上独占运行,最后将结果传回服务器A.