SQL Server性能提示

SQL Server性能提示,sql,sql-server,performance,sql-server-2005,tsql,Sql,Sql Server,Performance,Sql Server 2005,Tsql,可能重复: 关于这个问题,我有以下问题: select * from sometable where 1=1 or (select count(*) from table2 > 0) 如果第一个条件为true(1=1),SQL Server是否仍执行内部选择? 或者当第一个条件为真时停止(如C)当(1=1)为真时停止。您可以使用Ctrl-M然后使用Ctrl-E轻松地进行检查 考虑这个问题 select * from master..spt_values where 1=1 or (s

可能重复:

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

select * from sometable 
where 1=1 or (select count(*) from table2 > 0)
如果第一个条件为true(
1=1
),SQL Server是否仍执行内部选择? 或者当第一个条件为真时停止(如C)

当(1=1)为真时停止。您可以使用Ctrl-M然后使用Ctrl-E轻松地进行检查

考虑这个问题

select * from master..spt_values
where 1=1 or (select count(*) from master..sysobjects) > 0
执行计划仅在
master..spt\u值中显示扫描,在
sysobjects
中不显示活动


与C相反,当最左边的条件为真时,它不会停止,相反,查询优化器会独立于呈现的顺序计算出,这是需要评估的最小成本。在常量
1 vs 1
的情况下,赢家是明确的。

它短路的原因只是因为您正在比较文本。乐观主义者会检测到这种微不足道的比较


但是,如果您已经设置了参数,那么文本将被更改为参数,SQL Server将在一种一般情况下工作,即每一方都可能不同。根据强制参数化的一长串条件…

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

一般来说。不要编写依赖布尔短路来获得性能或正确性的查询。

这是一个查询,而不是一句话……执行计划说了什么?我不认为这是重复的。1=1与is NULL不一样。但这是因为它是一个常量比较,可以进行优化以始终计算为true吗?我感觉OP在问一个更广泛的问题,
where
子句是否短路。@Adam我也有这样的印象-这个查询表单通常用于可选参数