none
INNER JOIN时条件放在ON里还是WHERE里效率更高 RRS feed

  • 问题

  • 在使用INNER JOIN时会产生一个结果集,WHERE条件在这个结果集中再根据条件进行过滤,如果把条件都放在ON中,是否比放在WHERE中效率高一点呢,理论上感觉在INNER JOIN的时候就进行过滤了,比如
            SELECT *
             FROM A
          INNER JOIN B
              ON B.ID = A.ID
              AND B.State = 1
          INNER JOIN C
              ON B.ID = C.ID
    

    在联查B表时,就把状态不等于1的忽略掉了,这样对于状态不等于1的就不需要去联查C表了

            SELECT *
             FROM A
          INNER JOIN B
              ON B.ID = A.ID
          INNER JOIN C
              ON B.ID = C.ID
             WHERE B.State = 1
    
    则不管B的状态是否满足,都去联查C,最后再将B状态满足的查出来,效率应该没有前面的高吧,不知道我说的对不对,欢迎指正。

    2011年6月21日 4:12

答案

  • 查询引擎 会自动优化你的代码的

    放在那里效果都是一样的。

     

    你把下面的代码贴到视图里面就知道了,自动整理成上面这种类型了。


    family as water
    2011年6月21日 5:46

全部回复

  • 查询引擎 会自动优化你的代码的

    放在那里效果都是一样的。

     

    你把下面的代码贴到视图里面就知道了,自动整理成上面这种类型了。


    family as water
    2011年6月21日 5:46
  •   自己测试下,看下二者的执行计划以及执行成本最有说服力
    phil_he
    2011年6月23日 3:28
  • 效率是一样的,最后的执行计划里谓语肯定是在同一位置出现的。
    2011年6月23日 6:29
  • 执行计划里。是一样的。

    2011年11月15日 9:10
  • 如果你的SQL很简单,那么SQLSERVER会自动给你优化,但是如果你的SQL比较复杂,这个时候SQLSERVER就不会再给你进行优化了。

    如果你的SQL很复杂,而且JOIN了多次,肯定是写在ON后面的效率要高。尤其是JOIN之后的数据会比较大的时候,更加明显。

    这个我们曾经测试过。至于为什么,因为JOIN是从左到右的,减少了JOIN左侧的数据,自然会提高效率。

    2012年11月15日 1:53
  • 如果你的SQL很简单,那么SQLSERVER会自动给你优化,但是如果你的SQL比较复杂,这个时候SQLSERVER就不会再给你进行优化了。

    如果你的SQL很复杂,而且JOIN了多次,肯定是写在ON后面的效率要高。尤其是JOIN之后的数据会比较大的时候,更加明显。

    这个我们曾经测试过。至于为什么,因为JOIN是从左到右的,减少了JOIN左侧的数据,自然会提高效率。


    同意
    2012年11月15日 9:13