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我也有这样的印象-这个查询表单通常用于可选参数