有同事试过,改了where 条件中的 case when 改写之后速度马上提升了上来。在2005里是否需要什么设置?
解决方案 »
- 交叉报表问题~!
- 关于sql2000软件安装的问题
- 请帮忙查看下面一段sql语句
- 求助:以动态sql语句
- 一个简单的问题,帮忙解决下
- 在sql语句中如何使用变量????
- 大家看个备份的问题,字符串如何相加!
- 一个触发器的错误?
- 怎样才能把2000版的SQL Server数据库备份为7.0版的格式?
- 手工建库错误01504
- SQL server 2005数据库还原数据库时错错?system.Data.SqlClient.SqlError: 媒体集有 2 个媒体簇,但只提供了 1 个。必须提供所有成员。 (Microsoft.SqlServer.Smo)请高手指点
- 关于SQL两表关联的Insert问题?
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倍的速度。
因为存储过程很多,要是改脚本,工作量会非常大,除非别无他法。
请高手指点。
当 @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的写法不符合性能优化的原则,还是修改了好
非常感谢landi的热心帮助,现在单独改这个存储过程会有效果的,这样写确实不够优化,是肯定要修改的。但是现在移植过来后几百个存储过程有这种情况。想知道为什么2000里的存储过程到05里面就这种情况,我在网上也搜索了很多相关的文章。很多人提到2000里的存储过程到05里就超时,我这个是把超时设置关了,所以一直到查询出结果,其实也就是超时。