我有一个简单的选择查询,我正在执行如下:
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中执行。任何人都可以解释这种差异,并提出任何想法,如何将硬编码查询的性能延续到真正的查询中吗?
答案 0 :(得分:1)
第一个查询在两台服务器上以分布式方式运行。这可能很慢,因为服务器A不知道服务器B的统计信息,并且无法生成正确的执行计划。
第二个查询“将”查询“传输”到服务器B,然后查询在服务器B上独占运行,最后将结果传回服务器A.