选择不在另一个表中的键需要花费很长时间



我有一个这样的查询:

select key, name from localtab where key not in (select key from remotetab);

查询需要很长时间,我不明白为什么

localtab是本地表,remotetab是另一个服务器中的远程表。key是在两个表中都具有唯一索引的int列。当我分别查询这两个表时,只需要几秒钟的时间。

链接服务器的性能非常糟糕。将所需的数据获取到本地服务器,并在那里完成大部分艰苦的工作和处理,而不是在单个查询中混合使用本地和远程。

select远程选项卡到临时表

select [key] into #remote_made_local from remotetab

在进行where子句筛选时使用#temp表,并使用exists而不是in以获得更好的性能

select a.[key], a.name from localtab a where not exists (select 1 from #remote_made_local b where b.[key] = a.[key] )

Vs进行

select [key], name from localtab where key not in (select [key] from #remote_made_local)

还有一个不使用临时表的解决方案。

通过使用left join而不是not in (select ...),可以大大加快查询速度。像这样:

select l.key, l.name
from  localtab l left join remotetab r on l.key = r.key
where r.key is null ;

相关内容

最新更新