让我们检查一下这两个语句:
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 不能保证语句是否或以何种顺序在
WHERE
子句中处理。允许语句短路的单个表达式是CASE
-WHEN
。以下来自我在 Stackoverflow 上发布的答案:SQL Server 如何短路 WHERE 条件评估
有关更多详细信息,请查看上述博客条目中的第一个链接,该链接指向另一个博客:
SQL Server 是否短路?
在 T-SQL 中,
IF
语句可以短路,但您不能依赖它按顺序评估表达式SQL 是一种声明式编程语言。与命令式编程语言 C++ 不同。
即你可以告诉它你想要的最终结果,但你不能决定结果是如何执行的,这完全取决于引擎。
保证内部“短路”(或任何其他控制流)的唯一真正方法
WHERE
是使用索引视图、临时表和类似机制。PS。您还可以使用执行计划提示(“提示”引擎如何执行查询、要使用哪些索引以及如何使用它们),只是想我应该提一下,而我们正在讨论这个话题......
控制 WHERE 子句中条件的唯一方法是使用括号将它们组合在一起。
与
1)--OR (任何一个或两个条件都为真)
如果条件 1 为 TRUE,则条件 2 也将检查它可以是 TRUE 或 FALSE
--AND(两个条件都必须为真)
如果条件 1 为 FALSE,则不会检查条件 2