记得以前在ms sql7.0的年代,where 子句的条件会短路。现在居然不会了。
像这样一个语句:
Decalre @p1 int
set @p1=0
selct * from table1 where @p1=1 and filed1=1
在sql 7.0的执行计划里和统计结果里查看,不会对filed1=1进行查询操作,说明因为@p1=1这个表达式值不为真,就不再对后面的表达式求值了。发生了短路。
所以我的程序里的SP一直都是像这样写的,今年把数据库升级到2005,但发现程序执行效率越来越差,仔细分析,发现SP执行速度慢,做很久的试验发现问题出在这里,在SQL 2005里上面的那条语句,不管@p1=1这个表达式是什么值,照样要进行filed1=1这个表达式的求值,晕倒了。我所有的SP都是带了一大堆的参数,几十个表达式,如果不能发生短路操作,那么所有表达式都去求一次值,执行速度不慢才怪。
真是有点不明白,难道SQL 2005不再鼓励写SP了么?而是都要采用代码拼SQL语句,这种既不安全,效率也低的方式?还是要求写的SP的参数尽量少?
迷茫......
浙公网安备 33010602011771号