如何限制远程/链接服务器上的行

时间:2017-09-06 18:48:25

标签: sql-server database-performance linked-server

我有一个链接服务器,我必须从中获取数据。我正加入一张桌子,我希望这些桌子很少。查询在下面,似乎将所有行返回到原始服务器以进行排序。

我正在寻找一种方法来告诉查询过滤目标计算机,查询提示或其他内容。

查询

INSERT INTO #DealerHierarchy(DealerId, Level)
SELECT cd.ParentId, cd.Level
FROM [dbo].[AssignedDealer] ad 
JOIN [nlsdb].[nls].[dbo].[vw_parentDealers] cd ON cd.RootId = ad.DealerId
WHERE ad.UserId = @userId 
AND ad.IsActive = 1
AND (@DealerId IS NULL OR ad.DealerId = @DealerId)

当我添加以下行时,它似乎发生变化,只发回所需的行

and cd.RootId = 72311

我尝试将本地查询移出到单独的临时表中,然后从视图WHERE DealerId IN (select from temp table)中进行选择,但它仍然运行缓慢。在JOIN中添加REMOTE提示也没有任何作用。

查询计划: https://www.brentozar.com/pastetheplan/?id=r1iazaaFZ

在链接服务器上执行慢代码

declare @p1 int
set @p1=7
exec sp_prepexec @p1 output,N'@P1 numeric(10)',N'SELECT "Tbl1007"."ParentId" "Col1010","Tbl1007"."Level" "Col1011" FROM "nls"."dbo"."vw_parentDealers" "Tbl1007" WHERE @P1="Tbl1007"."RootId"',72311
select @p1

在链接服务器上执行的快速代码

declare @p1 int
set @p1=10
exec sp_prepexec @p1 output,NULL,N'SELECT "Tbl1007"."ParentId" "Col1010","Tbl1007"."Level" "Col1011" FROM "nls"."dbo"."vw_parentDealers" "Tbl1007" WHERE "Tbl1007"."RootId"=(72311.)'
select @p1

1 个答案:

答案 0 :(得分:0)

您可以使用OPENQUERY强制在远程数据库上运行特定查询。 OPENQUERY不接受参数,因此您可以通过将其包含在EXEC中来使其动态化。

实施例

DECLARE @SearchString NVARCHAR = ...
DECLARE @OpenQueryString NVARCHAR = 'SELECT * FROM OPENQUERY(remotedb, ''' + @SearchString + ''')'
EXEC (@OpenQueryString)