これらの2つのステートメントを調べてみましょう。
IF (CONDITION 1) OR (CONDITION 2)
...
IF (CONDITION 3) AND (CONDITION 4)
...
場合はCONDITION 1
、IS TRUE
、だろうCONDITION 2
チェックしますか?
場合はCONDITION 3
、IS FALSE
、だろうCONDITION 4
チェックしますか?
条件についてはどうですかWHERE
:SQL ServerエンジンはWHERE
句内のすべての条件を最適化しますか?SQL Serverオプティマイザーが条件を正しい方法で解決するために、プログラマは条件を正しい順序で配置する必要がありますか?
追加:
リンクを提供してくれたジャックに感謝します。t-sqlコードからの驚きです。
IF 1/0 = 1 OR 1 = 1
SELECT 'True' AS result
ELSE
SELECT 'False' AS result
IF 1/0 = 1 AND 1 = 0
SELECT 'True' AS result
ELSE
SELECT 'False' AS result
この場合、ゼロ除算例外は発生しません。
結論:
C ++ / C#/ VBに短絡がある場合、なぜSQL Serverにできないのですか?
これに真に答えるために、両方が条件でどのように機能するかを見てみましょう。C ++ / C#/ VBにはすべて、コードの実行を高速化するために言語仕様で定義された短絡回路があります。最初の条件が既に真であるときにN OR条件を評価する理由、または最初の条件がすでに偽であるときにM AND条件を評価する理由。
開発者としての私たちは、SQL Serverの動作が異なることに注意する必要があります。これはコストベースのシステムです。クエリの最適な実行プランを取得するには、クエリプロセッサがすべてのwhere条件を評価し、コストを割り当てる必要があります。これらのコストは全体として評価され、SQL Serverが適切な計画を立てるために定義されているしきい値よりも低くなければならないしきい値を形成します。コストが定義されたしきい値よりも低い場合、計画が使用されます。そうでない場合、条件コストの異なる組み合わせでプロセス全体が再度繰り返されます。ここでのコストは、スキャン、シーク、マージ結合、ハッシュ結合などです。このため、C ++ / C#/ VBで利用可能な短絡は不可能です。列でのインデックスの使用を強制することは短絡としてカウントされると思うかもしれませんが、そうではありません。それはそのインデックスの使用を強制するだけで、それにより可能な実行プランのリストを短縮します。システムはまだコストベースです。
開発者は、SQL Serverが他のプログラミング言語で行われているような短絡を行わず、強制するためにできることは何もないことに注意する必要があります。