【问题标题】:How does SQL Server evaluate logical expressions?SQL Server 如何计算逻辑表达式?
【发布时间】:2019-06-19 20:48:22
【问题描述】:

我正在编写一个有点复杂的 sql 查询 - 恐怕 - 执行起来可能很繁重。所以我想知道 MS SQL Server 是如何解决一些问题的。

如果有 ex1 AND ex2 这样的逻辑表达式,服务器是否总是同时评估它们?它是否总是先评估 ex1,然后评估 ex2(如果需要)? 是否已指定,我可以依赖它吗?

【问题讨论】:

  • orand 条件下,评估以快捷方式完成,因此只要一个条件匹配 (or) 或不匹配 (and ) 其余条件不被评估。因此,我们始终强烈建议将最常见的条件放在首位,然后按照此规则处理其他条件。
  • 这是否意味着服务器总是按照我写它们的顺序来评估表达式?我可以依靠它吗?

标签: sql sql-server query-optimization


【解决方案1】:

您指的是捷径评估。而且,是的,如果 SQL Server 正在计算表达式并且它计算的第一个表达式为假,那么它不会(必然)计算第二个表达式。

对此有一些警告。首先,您无法知道 SQL Server 选择首先评估哪一个。如果一个便宜而另一个昂贵(比如用户定义的函数),那么您可以使用case 表达式来控制执行顺序。

其次,表达式的评估通常不是在查询中需要时间。读取数据和匹配行以进行连接和聚合通常是查询中耗时的部分。因此,专注于微优化可能对您获得性能并没有太大帮助。

【讨论】:

  • 很好的答案@GordonLinoff 但我比在case when 声明中确定评估始终以您编写的方式执行。如果不是这样,为什么case when 1=1 then 1 when 1=1 and 2=2 then 2 else 3 end 总是返回 1?
  • @JaimeDrq 。 . . OP 指的是布尔表达式,而不是 case 表达式中的 when 子句(除非我误解了这个问题)。
  • 哎呀,你是对的......我把它们混淆了我的道歉。
【解决方案2】:

服务器首先评估exp1,如果为真则评估exp2,如果exp1为假则exp2 未评估

Sql 'and' 逻辑运算的工作方式与 'or' 运算不同

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多