我有一个这样的查询:
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 ;