Sql 现代DBMS是否包含短路布尔计算?
许多现代编程语言具有短路布尔求值,例如:Sql 现代DBMS是否包含短路布尔计算?,sql,database,optimization,Sql,Database,Optimization,许多现代编程语言具有短路布尔求值,例如: if (x() OR y()) 如果x()返回true,则永远不会计算y() 现代DBMS(SQL Server、Sybase、Oracle、DB2等)上的SQL是否具有此属性? 特别是,如果布尔语句的左侧是布尔常量,它会短路吗 相关:是和否 (以下仅指SQL Server) 有些操作员短路,有些操作员不短路或可以短路,但可能不取决于查询引擎选择的操作顺序 CASE是(我相信)100%保证短路的 还可以尝试使用嵌套括号强制计算顺序,如: IF((X)
if (x() OR y())
如果x()
返回true,则永远不会计算y()
现代DBMS(SQL Server、Sybase、Oracle、DB2等)上的SQL是否具有此属性?
特别是,如果布尔语句的左侧是布尔常量,它会短路吗
相关:是和否 (以下仅指
SQL Server
)
有些操作员短路,有些操作员不短路或
可以短路,但可能不取决于查询引擎选择的操作顺序
CASE
是(我相信)100%保证短路的
还可以尝试使用嵌套括号强制计算顺序,如:
IF((X)或Y)
但我不确定这是否总是一致的
SQL在这方面的问题在于它是声明性的,而实际的逻辑是由引擎执行的。事实上,首先从您的示例中检查Y
,然后检查X
——例如,如果Y
已编制索引且X
需要表格扫描,则可能更有效
供参考:
来自ANSI-SQL文档
如果优先级不是由格式或
括号中,表达式的有效计算通常是
从左到右执行。但是,它取决于实现
表达式是否实际从左到右求值,尤其是
当操作数或运算符可能导致引发条件时,或者
表达式的结果可以不完全确定
计算表达式的所有部分
专门针对SQL Server—有点像 指定OR语句的顺序不能保证短路,因为如果优化器认为这样做可以获得更好的性能收益,则可以随意对它们重新排序 但是,基础发动机本身可能也将短路。这是用户无法控制的
下面的文章(链接到其他优秀的讨论/参考资料)有更多关于这个主题的内容:CASE不在SQL中,所以我不确定它是如何应用的。(不过是在t-sql中)@Billy-说得好,我在答案的开头加了一条警告。PostgreSQL也是如此[出于同样的原因]。