21

SQLServerに相談したいまたは短絡

コード:

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'ですtrue

SQL Server OR演算子:短絡関数かどうか?</ p>

ありがとう

4

3 に答える 3

17

SQL内では、OR句が早期に中断する必要はありません。つまり、両方の条件を同時にチェックするかどうかは、オプティマイザ次第です。私はMSSQLオプティマイザーの専門家ではありませんが、オプティマイザーがOR句を短絡した場合と短絡していない場合があります。

于 2012-06-27T05:20:16.667 に答える
5

この質問に出くわし、すでにこのブログエントリを見つけていました:http://rusanu.com/2009/09/13/on-sql-server-boolean-operator-short-circuit/

SQLサーバーは、適切と思われる場所であればどこでもクエリを自由に最適化できるため、ブログ投稿に示されている例では、短絡に依存することはできません。

ただし、CASEは、書面の順序で評価するために文書化されているようです。そのブログ投稿のコメントを確認してください。

于 2012-08-14T19:35:41.613 に答える
-4

MS Sqlサーバーが短絡理論をサポートし、不要なチェックを回避してパフォーマンスを向上させることは明らかですが、

裏付けとなる例:

SELECT 'TEST'
WHERE 1 = 'A'

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

ここで、最初の例では、「varchar値「A」をデータ型intに変換するときに変換に失敗しました」というエラーが発生します。

条件1=1がTRUEと評価されたため、2番目の条件は簡単に実行されますが、2番目の条件はまったく実行されません。

さらに

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

ここでは、最初の条件がfalseと評価されるため、DBMSは2番目の条件に移行し、上記の例のように変換エラーが発生します。

注:クエリの結果がエラーで、条件が実行された、または短絡されたという意味で、条件が実行された、または短絡したかどうかを確認するために、誤った条件を作成しました。

簡単な説明

検討、

WHERE 1 = 1 OR 2 = 2

最初の条件がTRUEと評価されるため、2番目の条件を評価しても意味がありません。どのような値でも評価しても結果にまったく影響しないため、SQL Serverは、不要な条件のチェックや評価をスキップすることで、クエリの実行時間を節約できます。 。

「OR」の場合、最初の条件がTRUEと評価されると、 「OR」で接続されたチェーン全体が、他の条件を評価せずにtrueと評価されたと見なされます。

condition1 OR condition2 OR ..... OR conditionN

condition1がtrueと評価された場合、conditionNがスキップされるまですべての条件を休ませます。最初のTRUEの決定時の一般化された単語では、ORによってリンクされた他のすべての条件はスキップされます。

2番目の条件を検討してください

WHERE 1 = 0 AND 1 = 1

最初の条件がFALSEに評価されているため、2番目の条件を評価しても意味がありません。これは、どのような値でも評価しても結果にまったく影響がないためです。この場合も、SQL Serverは、不要な条件のチェックや評価をスキップして、クエリの実行時間を節約できます。 。

「AND」の場合、最初の条件がFALSEと評価されると、 「AND」に接続されているチェーン全体が、他の条件を評価せずにFALSEと評価されたと見なされます。

condition1 AND condition2 AND ..... conditionN

condition1がFALSEと評価された場合、 conditionNがスキップされるまですべての条件を休ませます。最初のFALSEの決定時の一般化された単語では、 ANDでリンクされた他のすべての条件はスキップされます。

したがって、賢明なプログラマーは、常に、より安価な、または最も排除的な条件が最初に評価されるような方法で条件の連鎖をプログラムするか、または短絡の最大の利益を得ることができるような方法で条件を調整する必要があります。

よろしくお願いいたします。

Rk_Hirpara

于 2015-06-12T08:01:09.580 に答える