web-dev-qa-db-ja.com

論理演算子OR AND条件のANDおよびWHEREの条件の順序

次の2つのステートメントを調べてみましょう。

IF (CONDITION 1) OR (CONDITION 2)
...

IF (CONDITION 3) AND (CONDITION 4)
...

CONDITION 1TRUEで、CONDITION 2確認しますか?
もしCONDITION 3FALSEで、CONDITION 4確認しますか?

WHEREの条件について:SQL ServerエンジンはWHERE句のすべての条件を最適化しますか?プログラマーがrightの順序で条件を設定して、SQL Serverオプティマイザーがrightマナー?

追加:

リンクのジャックに感謝、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

この場合、Divide by zero例外は発生しません。

結論:

C++/C#/ VBが短絡している場合、SQL Serverがそれを実行できないのはなぜですか?

これに正直に答えるために、両方が条件でどのように機能するかを見てみましょう。 C++/C#/ VBはすべて、コード実行を高速化するために言語仕様で定義された短絡を備えています。なぜわざわざ最初の条件が真であるときにN OR条件を評価するか、または最初の条件がすでに偽であるときにM AND条件を評価する。

開発者は、SQL Serverの動作が異なることに注意する必要があります。コストベースのシステムです。クエリの最適な実行プランを取得するには、クエリプロセッサがすべてのwhere条件を評価し、それにコストを割り当てる必要があります。次に、これらのコストを全体として評価して、SQL Serverが適切な計画を立てるために定義したしきい値よりも低い必要があるしきい値を形成します。コストが定義済みのしきい値よりも低い場合は、計画が使用されます。そうでない場合は、条件コストのさまざまな組み合わせでプロセス全体が再度繰り返されます。ここでのコストは、スキャン、シーク、マージ結合、ハッシュ結合などのいずれかです。このため、C++/C#/ VBで利用できるような短絡は不可能です。列でのインデックスの使用を強制することは短絡と見なされるかもしれませんが、そうではありません。それはそのインデックスの使用を強制するだけであり、それによって可能な実行プランのリストが短縮されます。システムはまだコストベースです。

開発者は、SQL Serverが他のプログラミング言語で行われているような短絡を行わないこと、および強制的に実行することはできないことに注意する必要があります。

35
garik

SQL Serverでは、ステートメントがWHERE句で処理されるかどうか、またはその順序が保証されるわけではありません。ステートメントの短絡を許可する単一の式はCASE-WHENです。以下は、Stackoverflowに投稿した回答からの抜粋です。

SQL ServerがWHERE条件の評価を短絡する方法

それはそのように感じたときに行いますが、あなたがすぐに考える方法ではありません。

開発者は、SQL Serverが他のプログラミング言語で行われているような短絡を行わないこと、および =)それを強制するためにあなたができることは何もありません

詳細については、上記のブログエントリの最初のリンクを確認してください。

SQL Serverは短絡していますか?

最終的な評決?まあ、実際にはまだありませんが、特定の短絡を確実にできるのは、CASE式で複数のWHEN条件を表現するときだけです。 。標準のブール式では、オプティマイザは、クエリを実行しているテーブル、インデックス、およびデータに基づいて、適切と思われるものを移動します。

27
MicSim

T-SQLでは、 IF ステートメントは短絡する可能性がありますが、 式を順番に評価することに依存することはできません

SQLは宣言型プログラミング言語です。たとえば、命令型プログラミング言語であるC++とは異なります。

つまりあなたはそれを伝えることができますwhat最終結果で必要ですが、指示することはできませんhow結果が実行されている、それはすべてエンジン次第です。

WHERE内の「短絡」(または他の制御フロー)を保証する唯一の真の方法は、インデックス付きビューを一時的に使用することですテーブルと同様のメカニズム。

PS。実行プランのヒント(クエリの実行方法、どのインデックスを使用するか、どのように使用するかをエンジンに「ヒント」する)を使用することもできます。

0
jitbit