两个问题.相同的输出.一个需要2个小时,另一个需要0秒.为什么?

Leg*_*end 5 sql linked-server query-optimization sql-server-2008

我有一些ID插入临时表#A,如下所示:

SELECT DISTINCT ID
INTO #A
FROM LocalDB.dbo.LocalTable1
WHERE ID NOT IN (SELECT DISTINCT ID FROM LocalDB.dbo.LocalTable2)
GO

CREATE INDEX TT ON #A(ID)
GO
Run Code Online (Sandbox Code Playgroud)

我试图使用我在上一阶段收集的标识符从远程链接服务器获取一些信息:

查询1:

SELECT ID, Desc
FROM RemoteLinkedServer.DB.dbo.RemoteTable X
WHERE ID IN (SELECT ID FROM #A)
Run Code Online (Sandbox Code Playgroud)

查询2:

SELECT ID, Desc
FROM RemoteLinkedServer.DB.dbo.RemoteTable X
INNER JOIN #A Y
ON X.ID = Y.ID
Run Code Online (Sandbox Code Playgroud)

现在在下面的查询中,我正在做的是获取临时表的输出,复制行并将它们格式化为逗号分隔列表并手动将其放入查询中.

问题3:

SELECT ID, Desc
FROM RemoteLinkedServer.DB.dbo.RemoteTable X
WHERE ID IN (-- Put all identifiers here --)
Run Code Online (Sandbox Code Playgroud)

查询1并2花费2个小时来执行和查询3需要0秒(我的临时表包含大约200行).我不知道发生了什么,也没有权限来检查远程服务器是否在ID上有相关的索引,但是看到手动构造的查询在没有时间运行表明存在错误的情况,这简直令人费解.在查询优化阶段.

关于这里出了什么问题或者如何加快查询速度的想法?

Not*_*tMe 10

查询1和2会导致RemoteTable中的所有数据被拉入本地数据库以执行连接操作.这将占用RAM,网络带宽,并且在查询执行时通常非常慢.

查询3允许远程服务器筛选结果以仅发送您想要的匹配项.

基本上,它归结为谁做了工作.查询1/2需要您的本地数据库才能执行此操作; 查询3允许远程执行此操作.

如果该远程表中有大量数据,那么您可能会遇到网络拥塞等问题.

查询链接服务器的最佳方法是构建查询,例如远程服务器执行所有工作,并将结果发送回本地服务器.这将优化获取所需数据所需的网络,内存和磁盘资源量.

任何时候你必须跨越服务器边界(使用链接服务器)加入它将是一场灾难.

  • 可能你最好的办法是动态构造sql来对远程服务器执行,然后执行它.我们发现,对于我们对链接服务器进行的每种类型的调用,此方法都要快得多.使用游标然后一次运行一个查询可能会导致您达到事务速度限制; 你可能不想要的. (2认同)