有同事试过,改了where 条件中的 case when 改写之后速度马上提升了上来。在2005里是否需要什么设置?

解决方案 »

  1.   

    这是WHERE条件从句代码 
    where one.tbID= CASE WHEN @tbID=-1 THEN one.tbID ELSE @tbID END  
    AND five.sfID= CASE WHEN @sfID=-1 THEN five.sfID ELSE @sfID END
    AND five.slID= CASE WHEN @slID=-1 THEN five.slID ELSE @slID END
    AND five.rb= CASE WHEN @rb=-1 THEN five.rb ELSE @rb END
    AND five.sID= CASE WHEN @sID=-1 THEN five.sID ELSE @sID END
    AND five.stID= CASE WHEN @stID=-1 THEN five.stID ELSE @stID END
    and five.UserName like
    case when @UName='' then five.UName else '%'+@UName+'%' end
    and five.SName like
    case when @SName='' then five.SName else '%'+@SNAME+'%'  end
    and five.scID=
    case when @scID='' then five.scID else @scID end
    order by five.stID,five.rb,five.slID,five.sID,five.scID从where 后到 order by 注释,速度正常 2-3秒执行完毕。
    单独把order by 注释,速度提高4分钟 41秒执行完毕。
    都不注释 4:40-5分钟不等的时间执行完成。
    修改case when 为 where (@tbID=-1 or one.tbID= @tbID) 这种形式后执行速度正常2-3秒。
    但是这个过程在SQL2000下速度正常2-3秒,为什么到05里就慢了那么多呢。将近100倍的速度。
    因为存储过程很多,要是改脚本,工作量会非常大,除非别无他法。
    请高手指点。
      

  2.   

    where (@tbID=-1 or one.tbID= @tbID)
    当 @tbID=-1 时 one.tbID 字段就不参与搜索,如果one.tbID没有建立索引的话,对查询就没有影响。但是如果使用one.tbID= CASE WHEN @tbID=-1 THEN one.tbID ELSE @tbID END  
    的话,就不同了,当 @tbID=-1 时,还有个条件one.tbID= one.tbID 虽然不影响查询结果,但one.tbID 字段就参与搜索,如果one.tbID没有建立索引的话,就非常慢了,可能大部分时间,在table scan你可以结合执行计划看看。但是case when的写法不符合性能优化的原则,还是修改了好  
      

  3.   


    非常感谢landi的热心帮助,现在单独改这个存储过程会有效果的,这样写确实不够优化,是肯定要修改的。但是现在移植过来后几百个存储过程有这种情况。想知道为什么2000里的存储过程到05里面就这种情况,我在网上也搜索了很多相关的文章。很多人提到2000里的存储过程到05里就超时,我这个是把超时设置关了,所以一直到查询出结果,其实也就是超时。