但是很明显,MS Sql服务器支持短路理论,可以通过避免不必要的检查来提高性能,
支持示例:
SELECT 'TEST'
WHERE 1 = 'A'
SELECT 'TEST'
WHERE 1 = 1 OR 1 = 'A'
在这里,第一个示例将导致错误“将varchar值“ A”转换为数据类型int时转换失败。”
当条件1 = 1评估为TRUE时,第二个条件很容易运行,因此第二个条件根本不运行。
更进一步
SELECT 'TEST'
WHERE 1 = 0 OR 1 = 'A'
在这里,第一个条件的计算结果为false,因此DBMS将选择第二个条件,并且再次出现上述示例中的转换错误。
注意:我编写了错误的条件,只是为了在条件被执行或短路的情况下实现,如果查询结果出错则意味着该条件已被执行,而短路则以其他方式执行。
简单说明
考虑,
WHERE 1 = 1 OR 2 = 2
由于第一个条件的值被评估为TRUE,因此对第二个条件的值进行评估是没有意义的,因为它的值无论以什么值都不会影响结果,因此它是Sql Server通过跳过不必要的条件检查或评估来节省查询执行时间的好机会。
在“ OR”的情况下,如果将第一个条件评估为TRUE,则通过“ OR”连接的整个链将被视为评估为true,而不评估其他条件。
condition1 OR condition2 OR ..... OR conditionN
如果condition1的值为true,则休息所有条件,直到条件N被跳过。一般而言,在确定第一个TRUE时,将跳过通过OR链接的所有其他条件。
考虑第二个条件
WHERE 1 = 0 AND 1 = 1
由于第一个条件被评估为FALSE,因此对第二个条件进行评估是没有意义的,因为以任何值进行评估都不会影响结果,因此,再次为Sql Server提供了一个很好的机会,通过跳过不必要的条件检查或评估来节省查询执行时间。
在“与”的情况下,如果将第一个条件评估为FALSE,则与“与”关联的整个链条将被视为对FALSE进行评估,而不评估其他条件。
condition1 AND condition2 AND ..... conditionN
如果condition1的评估结果为FALSE,则休息所有条件,直到条件 N被跳过。一般而言,在确定第一个FALSE时,将跳过与AND链接的所有其他条件。
因此,明智的编程人员应始终以以下方式对条件链进行编程,即首先评估成本较低或消除程度最高的条件,或者以可以最大程度地受益于短路的方式来安排条件