解决方案 »

  1.   

    略微的读过MSSQLSERVER技术内幕
    其他数据库我不清楚,MSSQL2005里,左连接是内连接的下一阶段,内连接结束后,把存在于左输入而未存在于右输入的集,加回总的结果集,因此如果少了这一步效率应该要高些。
    还有,在编译的优化阶段,如果左连接的结果集和内连接一样时,会转换成内连接查询,即,优化器认为内连接要比左连接来的高效。
    当然,以上都是理论而已。
    不过就以往的尝试,也是发现内连接要快些。
      

  2.   

    我翻了《Inside08》找到一副图,确实是按照你解释的那样 ,sql server parser 是按照Cross join -> Inner join -> Outer join,
    我以前一直认为是这样的顺序:Cross join ->Outer join  -> Inner join。多谢你的回答。
      

  3.   

    是否应该从物理连接方式上来出发会比较好,如果是采用同一种物理连接的方法来看,其实不管是left join 还是inner join,整个资料的比对过程应该都是一样的,只是其中选择需要输出的结果集不一样
      

  4.   

    上面的资料非常好。不过我觉得,从理论上来分析,确实是 inner join的性能要好,因为是选出2个表都有的记录,而left join会出来左边表的所有记录、满足on条件的右边表的记录。所以从这点分析,我们可以发现inner join的性能要更好。当然,到底应该用 inner join还是left join,这个需要看具体的业务需求。
      

  5.   


    另外,实际情况为什么经常出现,left join的性能更好呢?这是因为往往最后的性能,不是简单的由 join的类型决定的,还和 索引、表的驱动顺序有关,还有统计信息是否准确有关系。所以,可能但从理论上来说inner join性能更好,但从更实际的角度,我们还要看 索引、统计信息、表的记录数等等情况,才知道到底哪种写法更快。
      

  6.   


    再有就是上面提到的,物理操作。有时候,从表面上来看我们确实用了 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的性能会相对较好。
      

  7.   

    左连接和内连接的逻辑定义不同,返回的数据量也可能是不同的,请问二者有性能上的可比性吗?建议了解一下表连接的3种方式: nested loop, merge join, hash join. LZ的问题应与这个有关.