让我们检查以下两个语句:
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条件,或者在第一个条件为false时评估M AND条件呢?
作为开发人员,我们必须意识到SQL Server的工作原理有所不同。这是一个基于成本的系统。为了获得我们查询的最佳执行计划,查询处理器必须评估每个条件,并为其分配成本。然后,对这些成本进行整体评估,以形成一个阈值,该阈值必须低于SQL Server为良好计划所定义的阈值。如果成本低于定义的阈值,则使用计划,如果不是,则使用条件成本的不同组合再次重复整个过程。这里的成本要么是扫描,要么是搜索,要么是合并联接,要么是哈希联接等。因此,根本无法实现C ++ / C#/ VB中的短路。您可能会认为强制在列上使用索引被视为短路,但事实并非如此。它仅强制使用该索引,从而缩短了可能的执行计划的列表。该系统仍基于成本。
作为开发人员,您必须意识到SQL Server不会像其他编程语言那样发生短路,并且您无能为力。