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

Sql server 链接服务器查询需要很长时间,除非过滤器是硬编码的,sql-server,performance,linked-server,Sql Server,Performance,Linked Server,我执行了一个简单的select查询,如下所示: SELECT Id FROM [LinkedServer].[Catalog].[dbo].[someTable] WHERE date = @someDate AND Id IN (SELECT Id FROM ids) ids是一个单列表,其中包含50个左右的ID FWIW。这些ID都是字符串,而不是INT,LinkedServer是跨大西洋的服务器。someTable是许多~3亿个日期、ID对到值的映射,具有适当的PK 奇怪的是,我无法理解

我执行了一个简单的select查询,如下所示:

SELECT Id FROM [LinkedServer].[Catalog].[dbo].[someTable] WHERE date = @someDate AND Id IN (SELECT Id FROM ids)
ids是一个单列表,其中包含50个左右的ID FWIW。这些ID都是字符串,而不是INT,LinkedServer是跨大西洋的服务器。someTable是许多~3亿个日期、ID对到值的映射,具有适当的PK

奇怪的是,我无法理解这个查询需要10秒才能执行——但是如果我用Id的硬编码内容替换ids中的SELECT Id,那么查询将读取

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

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


第二个查询将查询传输到服务器B,然后查询以独占方式在服务器B上运行,最后将结果传输回服务器A。

我将尝试在链接服务器上创建一个接受表值参数的存储过程。当您调用这样的过程时,ID表应该一批发送到远程服务器,作为一个隐式临时表存储在那里,并在那里使用,每行都不会返回。