AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 5333
Accepted
garik
garik
Asked: 2011-09-02 23:40:13 +0800 CST2011-09-02 23:40:13 +0800 CST 2011-09-02 23:40:13 +0800 CST

条件中的逻辑运算符 OR AND 和 WHERE 中的条件顺序

  • 772

让我们检查一下这两个语句:

IF (CONDITION 1) OR (CONDITION 2)
...

IF (CONDITION 3) AND (CONDITION 4)
...

如果CONDITION 1是TRUE,会CONDITION 2被检查吗?
如果CONDITION 3是FALSE,会CONDITION 4被检查吗?

条件如何WHERE:SQL Server 引擎是否优化WHERE子句中的所有条件?程序员是否应该按正确的顺序放置条件以确保 SQL Server 优化器以正确的方式解决它?

添加:

感谢 Jack 的链接,来自 t-sql 代码的惊喜:

IF  1/0 = 1 OR 1 = 1
      SELECT 'True' AS result
ELSE
      SELECT 'False' AS result


IF  1/0 = 1 AND 1 = 0
      SELECT 'True' AS result
ELSE
      SELECT 'False' AS result

在这种情况下,不会引发除以零异常。

结论:

如果 C++/C#/VB 有短路,为什么 SQL Server 不能有它?

要真正回答这个问题,让我们来看看两者是如何在条件下工作的。C++/C#/VB 都在语言规范中定义了短路以加速代码执行。为什么要在第一个已经为真时评估 N OR 条件或在第一个已经为假时评估 M AND 条件。

作为开发人员,我们必须意识到 SQL Server 的工作方式不同。这是一个基于成本的系统。为了获得我们查询的最佳执行计划,查询处理器必须评估每个 where 条件并为其分配成本。然后将这些成本作为一个整体进行评估,以形成一个阈值,该阈值必须低于 SQL Server 为一个好的计划而定义的阈值。如果成本低于定义的阈值,则使用计划,如果不是,则使用不同的条件成本组合再次重复整个过程。这里的成本是扫描或查找或合并连接或哈希连接等......因此,C++/C#/VB 中可用的短路是不可能的。您可能认为在列上强制使用索引算作短路,但事实并非如此。它只强制使用该索引,从而缩短可能的执行计划列表。该系统仍然基于成本。

作为开发人员,您必须意识到 SQL Server 不会像在其他编程语言中那样进行短路,并且您无法强制它这样做。

sql-server sql-server-2008
  • 5 5 个回答
  • 147203 Views

5 个回答

  • Voted
  1. Best Answer
    MicSim
    2011-09-03T00:03:21+08:002011-09-03T00:03:21+08:00

    SQL Server 不能保证语句是否或以何种顺序在WHERE子句中处理。允许语句短路的单个表达式是CASE- WHEN。以下来自我在 Stackoverflow 上发布的答案:

    SQL Server 如何短路 WHERE 条件评估

    它会在你喜欢的时候出现,但不是你立即想到的方式。

    作为开发人员,您必须知道SQL Server 不会像在其他编程语言中那样进行短路,并且您无法强制它执行.

    有关更多详细信息,请查看上述博客条目中的第一个链接,该链接指向另一个博客:

    SQL Server 是否短路?

    最终判决?好吧,我还没有真正的,但可以肯定地说,唯一可以确保特定短路的情况是在 CASE 表达式中表达多个 WHEN 条件时。 使用标准布尔表达式,优化器将根据您正在查询的表、索引和数据移动它认为合适的东西。

    • 29
  2. Jack Douglas
    2011-09-03T02:23:06+08:002011-09-03T02:23:06+08:00

    在 T-SQL 中,IF语句可以短路,但您不能依赖它按顺序评估表达式

    • 8
  3. jitbit
    2019-06-18T04:17:45+08:002019-06-18T04:17:45+08:00

    SQL 是一种声明式编程语言。与命令式编程语言 C++ 不同。

    即你可以告诉它你想要的最终结果,但你不能决定结果是如何执行的,这完全取决于引擎。

    保证内部“短路”(或任何其他控制流)的唯一真正方法WHERE是使用索引视图、临时表和类似机制。

    PS。您还可以使用执行计划提示(“提示”引擎如何执行查询、要使用哪些索引以及如何使用它们),只是想我应该提一下,而我们正在讨论这个话题......

    • 1
  4. mrdenny
    2011-09-10T23:53:52+08:002011-09-10T23:53:52+08:00

    控制 WHERE 子句中条件的唯一方法是使用括号将它们组合在一起。

    WHERE Col1 = 'Something' AND Col2 = 'Something' OR Col3 = 'Something' and Col4 = 'Something'
    

    与

    WHERE (Col1 = 'Something' AND Col2 = 'Something') OR (Col3 = 'Something' and Col4 = 'Something')
    
    • -3
  5. Ranjith Kumar
    2011-09-10T13:28:11+08:002011-09-10T13:28:11+08:00

    1)--OR (任何一个或两个条件都为真)

    如果条件 1 为 TRUE,则条件 2 也将检查它可以是 TRUE 或 FALSE

    --AND(两个条件都必须为真)

    如果条件 1 为 FALSE,则不会检查条件 2

    • -4

相关问题

  • 死锁的主要原因是什么,可以预防吗?

  • 我在索引上放了多少“填充”?

  • 是否有开发人员遵循数据库更改的“最佳实践”类型流程?

  • 如何确定是否需要或需要索引

  • 从 SQL Server 2008 降级到 2005

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    您如何显示在 Oracle 数据库上执行的 SQL?

    • 2 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    我可以查看在 SQL Server 数据库上运行的历史查询吗?

    • 6 个回答
  • Marko Smith

    如何在 PostgreSQL 中使用 currval() 来获取最后插入的 id?

    • 10 个回答
  • Marko Smith

    如何在 Mac OS X 上运行 psql?

    • 11 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Marko Smith

    将数组参数传递给存储过程

    • 12 个回答
  • Martin Hope
    Manuel Leduc PostgreSQL 多列唯一约束和 NULL 值 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler 什么时候应该将主键声明为非聚集的? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - 哪个更好作为主键? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick 如何优化大型数据库的 mysqldump? 2011-01-04 13:13:48 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve