2012-04-16 169 views
0

理论上,为什么内部连接的工作速度显着快于左外部连接,因为两个查询都返回相同的结果集。我有一个需要很长时间来描述的查询,但这是我看到更改单连接:左外部连接 - 6秒,内部连接 ​​- 0秒(查询的其余部分是相同的)。结果集:同SQL Server速度:左外部连接vs内部连接

+9

你比较了执行计划吗?如果你问一个模糊的问题,我希望你不要期待非常具体的结果。 – 2012-04-16 14:25:48

+0

如果您获得预期的结果,您应该做的第一件事是确保您的统计信息(和索引)是最新的。 – 2012-04-16 14:34:55

+0

@Aaron Bertrand是的,抱歉不能提供细节。执行计划看起来不同,但我没有很好地阅读。无论如何,我只是想,也许这是有一般原因... – ren 2012-04-16 15:05:17

回答

1

其实根据数据,左外连接和内部连接不会返回相同的results..most可能左外连接将有更多的结果,并再次依赖于数据..

+1

我不确定这是答案而不是评论。虽然在右表没有匹配行的情况下,左连接可能会返回更多结果,但OP明确指出,在他的情况下,两个* do *会生成相同的行。这可能是由于查询格式不正确(例如,连接/过滤条件不在正确的位置),但可能是左表没有右表中没有匹配的行。 – 2012-04-16 14:43:19

0

如果我将左连接更改为内连接,结果并不相同,我会担心的。我会怀疑你在where子句中的表左边有一个条件(可能不正确)把它变成一个内部连接。

喜欢的东西:

select * 
from table1 t1 
left join table2 t2 on t1.myid = t2.myid 
where t2.somefield = 'something' 

这是不一样的东西

select * 
from table1 t1 
left join table2 t2 
on t1.myid = t2.myid and t2.somefield = 'something' 

所以第一我会担心我的查询是不正确的开始,那么我会担心性能。内部连接是不是左侧连接的性能增强,它们表示两个不同的结果,并且应该返回不同的结果,除非您有一个表,每个记录总是会有匹配。在这种情况下,您更改为内部联接,因为另一个不正确不会提高性能。

关于左连接花费更长时间的原因,我最好的猜测是它连接到更多的行,然后通过where子句过滤出来。但这只是一个疯狂的猜测。要知道你需要看执行计划。

+0

总的来说,我同意,但公平地说,我已经用'LEFT OUTER JOIN'构建了查询,尽管今天的数据很容易适合'INNER JOIN' - 今天的结果并不一定是结果总是如此,可能会有后续引入的不匹配行(或过去存在的行)。所以如果内外连接今天产生相同的结果,我不会倾向于大声地敲响警钟。执行计划不同的事实使我相信两个查询之间的差异比联接关键字更多。 – 2012-04-16 15:10:12