我有一个链接服务器,我必须从中获取数据。我正加入一张桌子,我希望这些桌子很少。查询在下面,似乎将所有行返回到原始服务器以进行排序。
我正在寻找一种方法来告诉查询过滤目标计算机,查询提示或其他内容。
查询
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
答案 0 :(得分:0)
您可以使用OPENQUERY
强制在远程数据库上运行特定查询。 OPENQUERY
不接受参数,因此您可以通过将其包含在EXEC
中来使其动态化。
实施例
DECLARE @SearchString NVARCHAR = ...
DECLARE @OpenQueryString NVARCHAR = 'SELECT * FROM OPENQUERY(remotedb, ''' + @SearchString + ''')'
EXEC (@OpenQueryString)