SQL Server性能提示

3

关于这个查询,我有以下问题:

可能是重复的:
SQL WHERE子句是否短路评估?

select * from sometable 
where 1=1 or (select count(*) from table2 > 0)

如果第一个条件为真(1=1),SQL Server 是否仍然执行内部选择? 还是在第一个条件为真时停止执行(像C语言一样)?

2
这是一个查询 - 不是一个句子... - marc_s
1
执行计划显示了什么? - Abe Miessler
1
我不认为这是重复的。1=1不等同于IS NULL。 - gbn
4个回答

7

当(1=1)成立时,它会停止。您可以使用Ctrl-M然后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的情况下,胜者很明显。


但这是因为它是一个可以优化为始终评估为真的常量比较吗?我觉得OP正在询问“where”子句是否会短路的更广泛问题。 - Adam Robinson
@Adam 我也有这样的印象 - 这个查询表单通常用于可选参数。 - RichardTheKiwi

5

只有因为你比较字面量,它才会被短路。优化器检测到这个琐碎的比较。

但是如果你设置了强制参数化,那么这些字面量将被更改为参数,SQL Server 将处理一个一般情况,每个侧面都可以不同。这需要符合强制参数化的长列表条件...


1

0

我要指出的是,如果你说where 1=1或id = 10,你可能会得到不同的结果,我知道我在查询中添加了1=1并得到了不同的结果。在任何情况下都不应该在OR子句中使用1=1。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接