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

Lim*_*mey 5 sql sql-server msdtc linked-server

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

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

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)
Run Code Online (Sandbox Code Playgroud)

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

select a.*, b.phone
from table_a a, 
join (select id, phone from remote.B) as b on b.id = a.id
Run Code Online (Sandbox Code Playgroud)

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

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

dev*_*arc 4

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

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

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

  • “MERGE”并不是一个神奇的“走得更快”的提示。如果您没有制定正确的计划,最好先了解原因。 (3认同)