select City.*,State.state_name from (
select * from City where City_Id in(null)
) as city
inner join State on city.state_id=State.State_id
================================================
select City.*,State.state_name from city a
inner join State on city.state_id=State.State_id
where a.citry_id is null
朋友说下面的比上面的慢...
是这样的么??
可以解释下为什么么??

解决方案 »

  1.   

    朋友的解释
    ===================================================
    如果 City State 个1000条数据
    第1中方式   先查询()里的 CITY  也就是 1000条   假如结果是 10条
    再查询 10* 1000 的数据    也就是一共 10*1000+1000 条的数据
    第2种方式   因为直接联合查询  所以结果是  查询了1000*1000 条数据 
    一个是 1W1000条  一个是10W条    所以我说你的慢
    ===================================================
      

  2.   

    虽然从就基本原理来讲,你朋友说的大体不错但,sql也不是那么愚蠢的。在某些时候,优化分析器会先将where考虑进去。愚认为,这两句经过优化器后,执行效率应该是一样的,除非针对某一句做相对应之索引
      

  3.   

    这两个应该差不多,SQL执行并不是我们写成怎样它就怎么执行,SQL Server 会进行优化。自己看看执行计划
      

  4.   

    两个语句是一样的。。第二个select其实也是先找出cityry_id为null的记录再Inner join 所以两个语句的执行计划是一样的
      

  5.   

    去ISQL里去显示执行计划看成本
      

  6.   

    楼主朋友,从SQL优化的方法来看,在数据量比较大的情况下,下面的方法确实比上面的方法慢,而且慢的不止一个数量级.在数据量比较少的情况下,2者效率差不多,下面的方法可能稍快点.原因如下:
    在数据量比较大的情况下,查询应当先过滤不必要数据,再做连接和列选择.这样就可以减少不必要数据做连接所带来的消耗.
    在数据量较少的情况下,查询应当尽量避免嵌套,因为嵌套使得语句解析时浪费较多的时间.
    一般情况下2个以上表连接,数据量在千数量级以上时,嵌套所带来的时间消耗是可以容忍的.所以为了通用一些,还是选择第一种方案的好.