sql - 两个查询。相同的输出。一个需要2小时,另一个需要0秒。为什么?

标签 sql sql-server-2008 query-optimization linked-server

我在临时表中插入了一些 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

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

查询 1:

SELECT ID, Desc
FROM RemoteLinkedServer.DB.dbo.RemoteTable X
WHERE ID IN (SELECT ID FROM #A)

查询 2:

SELECT ID, Desc
FROM RemoteLinkedServer.DB.dbo.RemoteTable X
INNER JOIN #A Y
ON X.ID = Y.ID

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

查询 3:

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

查询 12 需要 2 小时才能执行,查询 3 需要 0 秒(我的临时表包含大约 200 行)。我不知道发生了什么,也没有权限检查远程服务器是否具有 ID 上的相关索引,但令人困惑的是,手动构建的查询立即运行,表明出现了问题。在查询优化阶段。

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

最佳答案

查询 1 和 2 导致 RemoteTable 中的所有数据被拉入本地数据库,以便执行联接操作。这会消耗 RAM、网络带宽,并且在执行查询时速度通常会非常慢。

查询 3 允许远程服务器过滤结果以仅发送您想要的匹配项。

基本上,归根结底就是谁来做这项工作。查询 1/2 需要您的本地数据库来完成;查询 3 让远程执行此操作。

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

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

任何时候您必须跨服务器边界加入(使用链接服务器),这都将是一场灾难。

关于sql - 两个查询。相同的输出。一个需要2小时,另一个需要0秒。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11910855/

相关文章:

SQL Server - 加入 4 个快速查询给我一个慢速查询

mysql - 简单的 mysql join 执行时间太长

sql - 当名称与表名相同时,内联索引定义失败

mysql - 如何在sql中使用范围获取价格范围?

mysql - 如何对重复记录进行 SQL 查询?

sql - 如何在 SQL Server 2008 中更改此计算列?

sql - 了解 SSMS 2008 中关系的更新和删除规则

sql - 单个 SSRS 报告中列出的多个报告是什么意思?

sql - 优化简单的 SQL 查询?

mysql - 优化子查询,使两个查询成为一个