C. *_*oss 5 sql database optimization
许多现代编程语言都有短路布尔评估,如下所示:
if (x() OR y())
Run Code Online (Sandbox Code Playgroud)
如果x()返回true,y()则永远不会评估.
现代DBMS(SQL Server,Sybase,Oracle,DB2等)上的SQL是否具有此属性?
特别是如果布尔语句的左侧是布尔常量,它是否会被短路?
是和不是。
(以下仅指SQL Server)
有些操作员会短路,有些则不会。 OR CAN短路,但可能不会,具体取决于查询引擎选择的操作顺序。
CASE(我相信)100% 保证会短路。
您还可以尝试使用嵌套括号强制计算顺序,例如:
IF ((X) OR Y)
但我也不肯定这总是一致的。
SQL 在这方面的问题在于它是声明性的,而实际的逻辑是由引擎执行的。事实上,Y首先从您的示例中检查,然后检查X- 例如,是否Y已索引并且X需要表扫描,这可能会更有效。
以供参考:
来自此答案的 ANSI-SQL 文档:
如果优先级不是由格式或括号确定的,则表达式的有效求值通常是从左到右执行的。但是, 表达式是否实际上从左到右求值取决于实现,特别是当操作数或运算符可能导致引发条件时,或者如果可以在不完全求值表达式所有部分的情况下确定表达式的结果。