【问题标题】:SQL Server performance tip [duplicate]SQL Server 性能提示 [重复]
【发布时间】:2011-06-29 07:21:46
【问题描述】:

可能重复:
Is the SQL WHERE clause short-circuit evaluated?

我对此查询有以下疑问:

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

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

【问题讨论】:

  • 这是一个查询 - 不是一个句子...
  • 执行计划怎么说?
  • 我不认为这是重复的。 1=1 与 IS NULL 不同。

标签: sql sql-server performance sql-server-2005 tsql


【解决方案1】:

当 (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 不同,它不会在 LEFTMOST 条件为真时停止,而是查询优化器独立于呈现的顺序进行计算,这是评估成本最低的。在常量1 vs 1 的情况下,胜者一目了然。

【讨论】:

  • 但这是否是因为它是一个恒定的比较,可以优化为始终评估为真?我觉得 OP 正在询问更广泛的问题,即 where 子句是否短路。
  • @Adam 我也有这样的印象——这个查询表单通常用于可选参数
【解决方案2】:

它只是因为您正在比较文字而短路。优化器检测到这种微不足道的比较。

但是,如果您设置了forced parameterisation,则文字将更改为参数,并且 SQL Server 可以在每一侧可能不同的一般情况下工作。受制于强制参数化的一长串条件...

【讨论】:

    【解决方案3】:

    作为一般规则,SQL Server does not guarantee boolean operator short-circuit。不要编写依赖布尔短路来提高性能或正确性的查询。

    【讨论】:

      【解决方案4】:

      我会指出,如果您说 where 1=1 或 id = 10,您可能会得到不同的结果,我知道我将 1=1 添加到查询中并得到不同的结果。在任何情况下,我都不会将 1=1 与 OR 子句一起使用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多