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


33

これらの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が他のプログラミング言語で行われているような短絡を行わず、強制するためにできることは何もないことに注意する必要があります。


最終引用ブロックはどこから来ますか?参照を追加してもらえますか?
ニックチャマス

回答:


25

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

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

気分が良いときにそれを行いますが、すぐに考える方法ではありません。

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

詳細については、上記のブログエントリの最初のリンクを確認してください。これは別のブログにつながっています。

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

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


2
どうやらcase 安全
Jack Douglas

1
また、CASEブレークする別のケース(ha!)を示します:dba.stackexchange.com/questions/12941/…–
アーロンバートランド


0

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

つまり、最終結果でを望むを伝えることはできますが、結果の実行方法を指示することはできません。すべてはエンジン次第です。

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

PS。また、実行トピックのヒントを使用することもできます(クエリの実行方法、使用するインデックス、および使用する方法をエンジンに「ヒント」するため)。


-4

1)-OR(いずれかまたは両方の条件がTRUEになります)

条件1がTRUEの場合、条件2もチェックされ、TRUEまたはFALSEになります。

--AND(両方の条件がTRUEでなければなりません)

条件1がFALSEの場合、条件2はチェックされません


「条件1がFALSEの場合、条件2はチェックされません」これは当てはまりません。上記の回答を参照してください。SQL Serverは、WHERE句で短絡評価を実行しないため、条件2を評価する場合があります。
ニックチャマス

-4

WHERE句内の条件を制御する唯一の方法は、ブラケットを使用してそれらをグループ化することです。

WHERE Col1 = 'Something' AND Col2 = 'Something' OR Col3 = 'Something' and Col4 = 'Something'

とは非常に異なります

WHERE (Col1 = 'Something' AND Col2 = 'Something') OR (Col3 = 'Something' and Col4 = 'Something')

ちょっと興味があるんだけど。これら2つの条件はどう違うのですか?異なる結果、パフォーマンス、実行計画?それらは同等だと思いました。
ypercubeᵀᴹ

最初のものでは、Col1、Col4、およびCol2またはCol3のいずれかに一致する必要があります。Col1とCol2に一致する2行目、またはCol3とCol4に一致する必要がありますが、Col1とCol4の両方を一緒に評価する必要はありません。
mrdenny

1
いいえ、あなたは間違っています。ANDの優先順位はよりも高くなりORます。両方とも同等です。あなたが言うことは、WHERE Col1 = x AND (Col2 = x OR Col3 = x) AND Col4 = xクエリに当てはまります。参照SQL-フィドルテスト
ypercubeᵀᴹ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.