【问题标题】:Do modern DBMS include short-circuit boolean evaluation?现代 DBMS 是否包括短路布尔评估?
【发布时间】:2011-10-21 02:32:00
【问题描述】:

许多现代编程语言都有短路布尔评估,例如:

if (x() OR y())

如果 x() 返回 true,则永远不会评估 y()

现代 DBMS(SQL Server、Sybase、Oracle、DB2 等)上的 SQL 是否具有此属性?

特别是如果布尔语句的左边是布尔常量,会不会短路?


相关:Do all programming languages have boolean short-circuit evaluation?

【问题讨论】:

    标签: sql database optimization


    【解决方案1】:

    专门为 SQL Server 说话 - 有点。

    您指定 OR 语句的顺序并不能保证短路,因为优化器可以随意重新排序它们,如果它认为这样做可以获得更好的性能增益。

    但是,底层引擎本身可以并且将会发生短路。这只是用户无法控制的事情。

    以下文章(链接到其他优秀的讨论/资源)有更多关于这个主题:http://weblogs.sqlteam.com/jeffs/archive/2008/02/22/sql-server-short-circuit.aspx

    【讨论】:

    【解决方案2】:

    是和不是。

    (以下专指SQL Server

    有些操作员会短路,有些则不会。 OR CAN 短路,但可能与查询引擎选择的操作顺序无关。

    CASE(我相信)100% 保证短路。

    您还可以尝试使用嵌套括号强制计算顺序,例如:

    IF ((X) OR Y)

    但我并不肯定这也总是一致的。

    SQL 在这方面的问题在于它是声明性的,而实际的逻辑是由引擎执行的。实际上,首先从您的示例中检查 Y 然后检查 X 可能更有效 - 例如,如果 Y 已编入索引并且 X 需要表扫描。

    供参考:

    来自 ANSI-SQL 文档from this answer:

    优先级不是由格式或由 括号,表达式的有效评估通常是 从左到右进行。但是,它取决于实现 表达式是否实际上是从左到右计算的,特别是 当操作数或运算符可能导致条件被引发时,或者如果 表达式的结果可以不完全确定 评估表达式的所有部分。

    【讨论】:

    • CASE 不在 SQL 中,所以我不确定它是如何应用的。 (虽然它在 t-sql 中)
    • @Billy - 好点,我在答案的开头添加了一个警告。
    猜你喜欢
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    • 2013-10-18
    • 2017-02-03
    相关资源
    最近更新 更多