链接服务器表上的INNER JOIN比子查询慢得多

时间:2012-01-25 20:20:13

标签: sql sql-server linked-server msdtc

我遇到了这种奇怪的情况,我想我会把它扔到人群中找出原因。

我有一个加入链接服务器上的表的查询:

select a.*, b.phone
from table_a a, 
join remote.table_b b on b.id = a.id
 (lots of data on A, but very few on B)

这个查询永远在说话(甚至从未发现实际的运行时间),那时我注意到B没有索引,所以我添加了它,但这并没有解决问题。最后,出于绝望,我尝试了:

select a.*, b.phone
from table_a a, 
join (select id, phone from remote.B) as b on b.id = a.id

在我看来,这个版本的查询应该具有相同的结果,但是请注意,它会立即响应!

任何想法为什么会挂起而另一个过程很快?是的,我确实等待确保在运行索引之前已经构建了索引。

4 个答案:

答案 0 :(得分:4)

这是因为sql server engine自动生成的有时(经常)执行计划并不像我们想要的那么好和明显。您可以在两种情况下查看执行计划。我建议在第一个查询中使用提示,类似于:INNER MERGE JOIN。

以下是有关此内容的更多信息:

http://msdn.microsoft.com/en-us/library/ms181714.aspx

答案 1 :(得分:3)

对于链接服务器,第二个变体在本地预取所有数据并进行连接,因为第一个变体可以{A}向{A}个每行的链接服务器进行inner loop join往返

答案 2 :(得分:1)

远程表,因为不在该服务器上?当子查询对表数据的副本进行单一请求时,连接是否可能实际上对远程表进行多次调用,从而减少了在网络上等待的时间?

答案 3 :(得分:1)

我只想猜测一下。当你访问remote.b它是另一台服务器上的表吗?

如果是,第二个查询更快的原因是,在处理数据之前,您对另一个服务器执行一次查询并从b获取所需的所有字段。在第一个查询中,您正在处理数据,同时您正在向另一个服务器发出多个请求。

希望这对你有所帮助。