可能重复: 是否评估SQL子句短路?
关于这个问题,我有以下问题:
select * from sometable
where 1=1 or (select count(*) from table2 > 0)如果第一个条件为真(1=1),Server是否仍然执行内部选择?还是在第一个条件为真时停止(如C)
发布于 2011-02-17 18:20:17
它在(1=1)为真时停止。您可以使用Ctrl然后Ctrl-E轻松地进行检查。
考虑一下这个查询
select * from master..spt_values
where 1=1 or (select count(*) from master..sysobjects) > 0执行计划只显示master..spt_values中的扫描,在sysobjects中不显示活动。
与C相反,当最左边的条件为真时,它不会停止,相反,查询优化器独立于表示的顺序计算出,这是计算成本最低的。在常量1 vs 1的情况下,赢家是明确的。
发布于 2011-02-17 18:23:40
这是短路,只是因为你在比较文字。优化器检测到这种微不足道的比较。
但是,如果您有强制参数化集,那么文字将更改为参数,并且Server处理的一般情况是,每一方可能是不同的。受强制参数化条件的限制.
发布于 2011-02-17 22:33:17
作为一般规则,Server不保证布尔运算符短路。。不要编写依赖布尔短路来获得性能或正确性的查询.
https://stackoverflow.com/questions/5032882
复制相似问题