【议论】左连接和内连接哪个性能更好

【讨论】左连接和内连接哪个性能更好?
前提:对比的两组SQL语句除了连接方式不一样(一个用左连,另一个用内连),其他的初始条件和状态都一样(即执行两组对比的SQL语句之前,DB库中的状态、设置、统计信息以及缓存计划都相同)。

我之前认为左连的效率要优于内连(至少不会比内连差),原因是内连是左连的一下阶段,内连先通过左连返回数据行,然后删除未匹配到的行,结果才是内连生成的实际结果。
但是我做过一组对比实验,内连的效率要优于左连(至少不会比左连差),实验还表明左连返回的数据行越多,左连的效率会越差。当然一组测试是有局限性的,另外,测试前DB初始条件也没有检查。所以仍然无法判断哪个优劣,但是至少对我以前的认识产生了怀疑。

我查询一些资料,有三种看法:
第一种:左连更优。http://stackoverflow.com/questions/17100819/left-join-significantly-faster-than-inner-join
第二种:内连更优。http://stackoverflow.com/questions/2726657/inner-join-vs-left-join-performance-in-sql-server
第三种:取决于实际情况。http://stackoverflow.com/questions/1810465/left-join-faster-or-inner-join-faster

想听下大家的看法,如果有实际的论证数据那就能好了。谢谢!
------解决思路----------------------
略微的读过MSSQLSERVER技术内幕
其他数据库我不清楚,MSSQL2005里,左连接是内连接的下一阶段,内连接结束后,把存在于左输入而未存在于右输入的集,加回总的结果集,因此如果少了这一步效率应该要高些。
还有,在编译的优化阶段,如果左连接的结果集和内连接一样时,会转换成内连接查询,即,优化器认为内连接要比左连接来的高效。
当然,以上都是理论而已。
不过就以往的尝试,也是发现内连接要快些。
------解决思路----------------------
左连接和内连接 取决于需要,性能是一样的
只要 能尽早缩小记录集的大小,开销就最低
------解决思路----------------------
是否应该从物理连接方式上来出发会比较好,如果是采用同一种物理连接的方法来看,其实不管是left join 还是inner join,整个资料的比对过程应该都是一样的,只是其中选择需要输出的结果集不一样
------解决思路----------------------
上面的资料非常好。

不过我觉得,从理论上来分析,确实是 inner join的性能要好,因为是选出2个表都有的记录,而left join会出来左边表的所有记录、满足on条件的右边表的记录。

所以从这点分析,我们可以发现inner join的性能要更好。当然,到底应该用 inner join还是left join,这个需要看具体的业务需求。


------解决思路----------------------

另外,实际情况为什么经常出现,left join的性能更好呢?

这是因为往往最后的性能,不是简单的由 join的类型决定的,还和 索引、表的驱动顺序有关,还有统计信息是否准确有关系。

所以,可能但从理论上来说inner join性能更好,但从更实际的角度,我们还要看 索引、统计信息、表的记录数等等情况,才知道到底哪种写法更快。

------解决思路----------------------

再有就是上面提到的,物理操作。

有时候,从表面上来看我们确实用了 left join,但经过优化器优化后,会发现操作变成了 inner join了。。。

这是为什么呢? 可以看下面的例子,这种最后相当于inner join:

select *
from a
left join b on a.id = b.id
where b.name = '123'

而下面的写法又所不同,这种最后用的就是left join:

select *
from a
left join b on a.id = b.id and  b.name = '123'

所以,两者才存在着这种转化关系,而且优化器确实会做这种优化,那说明 优化器认为 inner join的性能会相对较好。
------解决思路----------------------
学习了,我只会用,未深究,期待标准答案【议论】左连接和内连接哪个性能更好
------解决思路----------------------
左联当然要好
------解决思路----------------------
不同语义的语句对比效率有意义吗?
------解决思路----------------------
左连接和内连接的逻辑定义不同,返回的数据量也可能是不同的,请问二者有性能上的可比性吗?

建议了解一下表连接的3种方式: nested loop, merge join, hash join. LZ的问题应与这个有关.


------解决思路----------------------
未深究内连接和左联结的性能差异,学习