我有两台服务器。一个是我的,另一个是另一个公司的。在第二台服务器中,我不能创建任何数据库或添加任何函数或存储过程,但我需要返回信息以与数据库交叉连接。与交叉连接的服务器连接
例如,
select fieldA, fieldB from localTBL l
left join linkedserver.remoteDB.dboremoteTBL r on l.ID = r.ID
或
select fieldA, fieldB from linkedserver.remoteDB.dboremoteTBL r
where r.ID in (select l.ID from localTBL l)
我这样做,但表现得非常可怕。
是否有可能以更好的性能做到这一点?
我大多同意使用OPENQUERY的情绪,但这不像黑白声音。使用分布式查询(linkedserver.database.schema.table)**可以**首先返回所有数据,并在tempdb中创建一个副本(如果它认为合适),然后应用过滤器。这个答案听起来像它会一直这样做。 – GarethD
此外,分布式查询可以利用链接服务器上的统计信息,所以如果where子句意味着不会返回许多行,它将不会创建完整副本,并且会相应地调整任何进一步的交互(例如,可能会认为嵌套循环连接比散列匹配更有效,因为只有50行)。 OPENQUERY不能执行此操作,并且(AFAIK)始终假定将返回10,000行。这可能导致使用效率较低的连接回到其他数据。 – GarethD