如何限制 remote/linked 服务器上的行数
How to limit the rows on remote/linked server
我有一个链接服务器,我必须从中获取数据。我正在加入 table,我希望其中的行很少。查询在下面,似乎将所有行返回到原始服务器以在那里进行排序。
我正在寻找一种方法来告诉查询在目标机器上进行过滤,使用查询提示或其他方式。
查询
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
我尝试将本地查询移出到单独的临时文件 table,然后从视图 WHERE DealerId IN (select from temp table)
移出 select,但它仍然运行缓慢。在 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
您可以使用 OPENQUERY
在远程数据库上强制特定查询为 运行。 OPENQUERY
不接受参数,因此您可以通过将其进一步包装在 EXEC
.
中使其动态化
例子
DECLARE @SearchString NVARCHAR = ...
DECLARE @OpenQueryString NVARCHAR = 'SELECT * FROM OPENQUERY(remotedb, ''' + @SearchString + ''')'
EXEC (@OpenQueryString)
我有一个链接服务器,我必须从中获取数据。我正在加入 table,我希望其中的行很少。查询在下面,似乎将所有行返回到原始服务器以在那里进行排序。
我正在寻找一种方法来告诉查询在目标机器上进行过滤,使用查询提示或其他方式。
查询
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
我尝试将本地查询移出到单独的临时文件 table,然后从视图 WHERE DealerId IN (select from temp table)
移出 select,但它仍然运行缓慢。在 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
您可以使用 OPENQUERY
在远程数据库上强制特定查询为 运行。 OPENQUERY
不接受参数,因此您可以通过将其进一步包装在 EXEC
.
例子
DECLARE @SearchString NVARCHAR = ...
DECLARE @OpenQueryString NVARCHAR = 'SELECT * FROM OPENQUERY(remotedb, ''' + @SearchString + ''')'
EXEC (@OpenQueryString)