我遇到了这种奇怪的情况,我想我会把它扔到人群中找出原因。
我有一个加入链接服务器上的表的查询:
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
在我看来,这个版本的查询应该具有相同的结果,但是请注意,它会立即响应!
任何想法为什么会挂起而另一个过程很快?是的,我确实等待确保在运行索引之前已经构建了索引。
答案 0 :(得分:4)
这是因为sql server engine自动生成的有时(经常)执行计划并不像我们想要的那么好和明显。您可以在两种情况下查看执行计划。我建议在第一个查询中使用提示,类似于:INNER MERGE JOIN。
以下是有关此内容的更多信息:
答案 1 :(得分:3)
对于链接服务器,第二个变体在本地预取所有数据并进行连接,因为第一个变体可以{A}向{A}个每行的链接服务器进行inner loop join
往返
答案 2 :(得分:1)
远程表,因为不在该服务器上?当子查询对表数据的副本进行单一请求时,连接是否可能实际上对远程表进行多次调用,从而减少了在网络上等待的时间?
答案 3 :(得分:1)
我只想猜测一下。当你访问remote.b它是另一台服务器上的表吗?
如果是,第二个查询更快的原因是,在处理数据之前,您对另一个服务器执行一次查询并从b获取所需的所有字段。在第一个查询中,您正在处理数据,同时您正在向另一个服务器发出多个请求。
希望这对你有所帮助。