现代DBMS是否包括短路布尔评估?

时间:2011-08-05 18:12:00

标签: sql database optimization

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

if (x() OR y())

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

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

特别是如果布尔语句的左侧是布尔常量,它是否会被短路?


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

2 个答案:

答案 0 :(得分:1)

是和否。

(以下仅指SQL Server

有些运营商短路,有些运营商没有。 OR CAN 短路,但可能不会取决于查询引擎选择的操作顺序。

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

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

IF ((X) OR Y)

但我不肯定这也是一贯的。

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

供参考:

来自ANSI-SQL文档from this answer:

  

优先级不是由格式决定的   括号,表达式的有效评价一般   从左到右执行。但是,依赖于实现   表达式是否实际上从左到右进行了评估,尤其是   当操作数或运算符可能导致条件被提升或者是否   表达式的结果可以在没有完全确定的情况下确定   评估表达式的所有部分。

答案 1 :(得分:1)

专门针对SQL Server发言 - 等等。

您指定OR语句的顺序不能保证短路,因为如果通过这样做可以获得更好的性能提升,优化器可以随意重新排序。

然而,底层引擎本身可以并且将会短路。这只是用户无法控制的东西。

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