2012-01-13 9 views
1

これが正しいフォーラムかどうかはわかりません。私は、次ていると言うことができます:SQLクエリ:boolean処理

SELECT * 
FROM MyTable m 
WHERE ((A OR B) AND (C OR D)) 

をA、B、C、Dはそれぞれ行レベルに基づいて評価する必要がある適切なブール節であると仮定する。また、インデックスがないと仮定します。

これは論理的に等価である:

SELECT * 
FROM MyTable m 
WHERE (A AND C) 
    OR (A AND D) 
    OR (B AND C) 
    OR (B AND D) 

どちらか一方にパフォーマンス上の利点がありますか?私たちはMSSql-2008を利用しています。

+0

奇妙な質問 - +1 – XIVSolutions

+0

クエリオプティマイザは、物事をシャッフルするすべての権利を予約しています。統計とインデックスに基づいて、それはまったく予想外のことをするかもしれません。それは、カジュアルな読者には明らかに見えるように、私はあなたの最初の例を挙げるでしょう。 – HABO

+0

ユースケースは実際に生成されたSQLのためのものです。そのため、ユーザーには比較的まれなデバッグ以外は表示されません。 – Shlomo

答えて

1

ので、私の理解では、あなたの最初のケースは、より効率的であるということです。どちらもあれば、文全体が失敗した ((A OR B)AND(C OR D))

:この句の

AまたはBは真です。ステートメントの第2部分(C OR D)は評価されません。最悪の場合は、文全体が評価される前に4つの基準がチェックされます(A = False、B = False、C = Falseの場合) False、しかしD = True)。最も良い場合は、AとBのみをチェックした後に文がFalseになる。どちらも真でない場合、文全体がFalseになる。

2番目のケースでは、4つのケースのそれぞれを評価してから、ステートメント全体を評価できるようにする必要があります。

ANDの中にOR条件を入れ子にするのは、最初のケースが失敗した場合、それ以上は興味がありません。最初のペアとして誤っている可能性が最も高いケースを配置すると、さらに改善されます。

私はこれについて他の人から聞くことに興味があります。 。 。

+1

だから、最初のステートメントのベストケースはA:False + B:False、2つの評価だけです。その場合、2番目のステートメントはA + Bのみを評価します。これらは論理的に同等です.SQL Serverがわかりやすくあれば、違いはありません。正しい答えがあると私は仮定している。 – Shlomo

+0

私の大きな好奇心は、「A」が毎回再評価された場合です... – Shlomo

+0

論理的に同等であることに同意しますが、(括弧で指示される)操作の順序は一部のコンパイラにとって重要です。私は同意する - 私もAがケース2で毎回評価されるかどうかを知ることに興味がある。 – XIVSolutions

関連する問題