2016-10-18 6 views
0

他の質問here on SOとgoogleは、MS Sql ServerがWHERE句の式を短絡することを保証していないようです。SQLはWHERE CLAUSEのORの評価を短絡しますか?

これは、このようなWHERE式が動作することを信頼できないということですか?

... WHERE (@include_voided = 1 OR mytable.void = 0) AND ... 

私は頻繁にこの種の表現をストアドプロシージャで使用します。記事のすべてのように、これはと交換する必要がある場合、私は今疑問に思って別の理由...

... WHERE mytable.void = case when @include_voided=1 then mytable.void else 0 END 

...のための短絡を研究したが、そのCASE文は、短期保証する唯一のものであることを示すように見えます回路。

私は最初の式が読みやすく、入力しやすいという理由だけでうまくいくことを期待しています。

+0

Btwでは、 '@include_voided = NULL'の結果が違うでしょう。また、これらの検索条件をsargableにすることはできません(つまり、ここでインデックスを検索する方法はありません)ので、書きやすい方を使用してください。 – wqw

答えて

3

SQL Serverが特定の式を短絡しているかどうかは、ここでは関係ありません。いずれかの方法で正しい結果が生成されます。この場合、短絡は単なる最適化に過ぎない。

最適化については、インデックスの作成方法に依存します。これらは(理想的には)インデックスシークです。

2

あなたの質問は本当に意味をなさない。 caseステートメントは、実際には元のorより複雑です。元のorは、の両方を評価する必要がありますか?の式は何ですか?以下のような何か:

  • は本当にそれに関連するすべての時間を持っている
  • が0

これらの一つだけにそれを比較レコードから値を取得する0

  • にパラメータを比較 - フェッチレコードの値はおそらく複数のハードウェア操作を伴います。

    caseは何をする必要がありません:

    • は、レコードから値を取得します。
    • にパラメータを比較私は、これはどのような方法が簡単であるかを確認していない0

    に値を比較してください。

    いずれにしても、実際の問題はこのようなマイクロ最適化ではありません。実際のパフォーマンスの問題は、SQLエンジンがクエリのインデックスを使用できるかどうかです。 orを使用すると、インデックスが問題になります。このため、パフォーマンスが主な関心事で、さまざまな条件に対して適切なインデックスがある場合は、動的SQLを考慮する必要があります。