我想咨询下SQL Server或短路
码:
DECLARE @tempTable table
(
id int
)
INSERT @tempTable(id) values(1)
DECLARE @id varchar(10)
SET @id = 'x'
SELECT * FROM @tempTable WHERE 1=1 OR id = @id --successfully
SELECT * FROM @tempTable WHERE @id = 'x' OR id = @id --Exception not Convert 'x' to int
为什么? 1 = 1和@ ID = 'X' 是真实的。
SQL Server或运营商:是否短路功能?
谢谢
在SQL中, 没有要求,即or子句早期破坏。 换句话说,它是由优化是否simutaneously检查这两个条件。 我不是在MSSQL优化的专家,但我所看到的情况,其中优化,也没有短路or子句。
只是绊了这个问题,并且已经发现这个博客条目: http://rusanu.com/2009/09/13/on-sql-server-boolean-operator-short-circuit/
SQL服务器是免费的优化查询的任何地方它认为合适的,所以在博客中给出的例子,你可以不依赖于短路。
然而,情况显然是记录在书面为了评估 - 检查博客文章的评论。
它是但明显的是,MS SQL服务器支持短路理论,通过避免不必要的检查,以提高性能,
支撑实施例:
SELECT 'TEST'
WHERE 1 = 'A'
SELECT 'TEST'
WHERE 1 = 1 OR 1 = 'A'
这里,第一实施例将导致成错误A“转换VARCHAR值时,转换失败‘’为int数据类型”。
虽然第二容易运行作为评价为TRUE条件1 = 1,从而所述第二条件完全不跑。
进一步
SELECT 'TEST'
WHERE 1 = 0 OR 1 = 'A'
这里的第一个条件将评估为假,因此DBMS会去的第二个条件,并再次你会得到转换的错误,如上面的例子。
注:我写的错误条件只是为了实现气象条件下执行或短路如果查询结果在错误是指执行时,短路否则该条件。
简单解释
考虑,
WHERE 1 = 1 OR 2 = 2
作为第一个条件是越来越评估为TRUE,它的意义的评估第二个条件,因为它在任何价值评估不会影响结果可言,因此它的SQL Server的好机会,跳过不必要的状态检查或评估节省查询执行时间。
在的情况下,“OR”如果第一条件被评估为TRUE由连接在整个链“OR”将视为评估为真不评价他人。
condition1 OR condition2 OR ..... OR conditionN
如果条件1被评估为真,其余全部条件,直到conditionN会被跳过。 在判定第一TRUE的广义词,通过OR连接的所有其他条件将被跳过。
考虑第二个条件
WHERE 1 = 0 AND 1 = 1
作为第一个条件是越来越evalutated为FALSE其意义的评估第二个条件,因为它在任何价值评估不会影响结果可言,如此反复了好机会,让SQL Server来跳过不必要的状态检查或评估节省查询执行时间。
在的情况下,“与”,如果第一条件被评估为假与“AND”将被认为连接在整个链作为评价为FALSE没有评价他人。
condition1 AND condition2 AND ..... conditionN
如果条件1被评估为FALSE,其余全部条件,直到conditionN会被跳过。 在确定第一个假的广义词,所有其他条件通过链接,并会被跳过。
THEREFOR,一个明智的程序员应该始终设置条件的环比这样的方式,更便宜或大部分消除条件GETS首先评估,或安排的条件以这样的方式,可以采取短路效益最大化
感谢致敬,
Rk_Hirpara