OR Operator Short-circuit in SQL Server

后端 未结 3 1609
南笙
南笙 2020-11-27 22:22

I want to consult SQL Server OR short-circuit

Code:

   DECLARE @tempTable table
      (
         id int
      )
      INSERT @tempTable(id) values(1         


        
相关标签:
3条回答
  • 2020-11-27 22:40

    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

    Thanks and Regards,

    Rk_Hirpara

    0 讨论(0)
  • 2020-11-27 22:45

    Within SQL, there is no requirement that an OR clause breaks early. In other words, it is up to the optimizer whether to check both conditions simutaneously. I am not an expert in the MSSQL optimizer, but I have seen instances where the optimizer has and has not short circuited an OR clause.

    0 讨论(0)
  • 2020-11-27 22:57

    Just stumbled over this question, and had already found this blog-entry: http://rusanu.com/2009/09/13/on-sql-server-boolean-operator-short-circuit/

    The SQL server is free to optimize a query anywhere it sees fit, so in the example given in the blog post, you cannot rely on short-circuiting.

    However, a CASE is apparently documented to evaluate in the written order - check the comments of that blog post.

    0 讨论(0)
提交回复
热议问题