Is the SQL WHERE clause short-circuit evaluated?

前端 未结 14 2651
时光取名叫无心
时光取名叫无心 2020-11-22 04:31

Are boolean expressions in SQL WHERE clauses short-circuit evaluated ?

For example:

SELECT * 
FROM Table t 
WHERE @key IS NULL OR (@key IS NOT NULL          


        
14条回答
  •  旧时难觅i
    2020-11-22 04:47

    It is but obvious that MS Sql server supports Short circuit theory, to improve the performance by avoiding unnecessary checking,

    Supporting Example:

    SELECT 'TEST'
    WHERE 1 = 'A'
    
    SELECT 'TEST'
    WHERE 1 = 1 OR 1 = 'A'
    

    Here, the first example would result into error 'Conversion failed when converting the varchar value 'A' to data type int.'

    While the second runs easily as the condition 1 = 1 evaluated to TRUE and thus the second condition doesn't ran at all.

    Further more

    SELECT 'TEST'
    WHERE 1 = 0 OR 1 = 'A'
    

    here the first condition would evaluate to false and hence the DBMS would go for the second condition and again you will get the error of conversion as in above example.

    NOTE: I WROTE THE ERRONEOUS CONDITION JUST TO REALIZE WEATHER THE CONDITION IS EXECUTED OR SHORT-CIRCUITED IF QUERY RESULTS IN ERROR MEANS THE CONDITION EXECUTED, SHORT-CIRCUITED OTHERWISE.

    SIMPLE EXPLANATION

    Consider,

    WHERE 1 = 1 OR 2 = 2
    

    as the first condition is getting evaluated to TRUE, its meaningless to evaluate the second condition because its evaluation in whatever value would not affect the result at all, so its good opportunity for Sql Server to save Query Execution time by skipping unnecessary condition checking or evaluation.

    in case of "OR" if first condition is evaluated to TRUE the entire chain connected by "OR" would considered as evaluated to true without evaluating others.

    condition1 OR condition2 OR ..... OR conditionN
    

    if the condition1 is evaluated to true, rest all of the conditions till conditionN would be skipped. In generalized words at determination of first TRUE, all other conditions linked by OR would be skipped.

    Consider the second condition

    WHERE 1 = 0 AND 1 = 1
    

    as the first condition is getting evalutated to FALSE its meaningless to evaluate the second condition because its evaluation in whatever value would not affect the result at all, so again its good opportunity for Sql Server to save Query Execution time by skipping unnecessary condition checking or evaluation.

    in case of "AND" if first condition is evaluated to FALSE the entire chain connected with the "AND" would considered as evaluated to FALSE without evaluating others.

    condition1 AND condition2 AND ..... conditionN
    

    if the condition1 is evaluated to FALSE, rest all of the conditions till conditionN would be skipped. In generalized words at determination of first FALSE, all other conditions linked by AND would be skipped.

    THEREFOR, A WISE PROGRAMMER SHOULD ALWAYS PROGRAM THE CHAIN OF CONDITIONS IN SUCH A WAY THAT, LESS EXPENSIVE OR MOST ELIMINATING CONDITION GETS EVALUATED FIRST, OR ARRANGE THE CONDITION IN SUCH A WAY THAT CAN TAKE MAXIMUM BENEFIT OF SHORT CIRCUIT

提交回复
热议问题