【发布时间】:2020-08-20 11:27:12
【问题描述】:
我有一个这样的查询:
select key, name from localtab where key not in (select key from remotetab);
查询需要很长时间,我不明白为什么。
localtab 是本地表,remotetab 是另一个服务器中的远程表。 key 是一个 int 列,在两个表中都有唯一索引。当我分别查询这两个表时,只需几秒钟。
【问题讨论】:
-
"并且 remotetab 是另一个服务器中的远程表。" 你的问题。对于这样的远程查询,需要将 整个 表从远程实例传输到本地实例,然后针对从该传输创建的临时对象执行过滤(这将最可能是在
tempdb中创建的工作表)。 -
好的,但是独立的
select * from remotetab确实只需要几秒钟(在这种情况下所有数据都已传输)。我们谈论大约 100.000 条记录。 -
可能是
localtab中的每一行都会有一次传输和扫描,而不是1次传输然后扫描localtab中的所有行的表。这就是为什么 vvvv4d 所建议的可能具有非常不同的性能。此外,正如我所提到的,整个表被传输,所以不仅仅是key列的值,而是所有列的值。 -
啊好吧!是的,我假设只有一次远程表传输!但似乎这个假设是不正确的。不使用临时表还有其他想法吗?
-
“还有什么不使用临时表的想法吗?” 临时表通常是这里的方式。否则,您需要研究一种将数据从远程实例复制到本地实例的方法,然后(本地)实例可以执行足够的查找操作。
标签: sql-server sql-server-2014