再有就是上面提到的,物理操作。有时候,从表面上来看我们确实用了 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的性能会相对较好。
其他数据库我不清楚,MSSQL2005里,左连接是内连接的下一阶段,内连接结束后,把存在于左输入而未存在于右输入的集,加回总的结果集,因此如果少了这一步效率应该要高些。
还有,在编译的优化阶段,如果左连接的结果集和内连接一样时,会转换成内连接查询,即,优化器认为内连接要比左连接来的高效。
当然,以上都是理论而已。
不过就以往的尝试,也是发现内连接要快些。
我以前一直认为是这样的顺序:Cross join ->Outer join -> Inner 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的性能会相对较好。