この特定の状況に取り組んでいることから、論理演算子が SQL で短絡していないことがわかりました。
私は通常、where 句で次の行に沿って何かを行います (通常は検索クエリを処理するとき)。
WHERE
(@Description IS NULL OR @Description = myTable.Description)
この例では短絡していなくても、実際には問題ではありません。ただし、全文検索関数を扱う場合は問題になります。そのクエリの 2 番目の部分が の場合、CONTAINS(myTable.Description, @Description)
これらの関数では変数を null または空にすることは許可されていないため、機能しません。
WHEN
のステートメントが順番に実行されることがわかったCASE
ので、次のようにクエリを変更して、必要な場合にのみフルテキスト ルックアップが呼び出されるようにし、変数を null から null の'""'
場合に変更してクエリを実行できるようにします。
WHERE
(CASE WHEN @Description = '""' THEN 1 WHEN CONTAINS(myTable.Description, @Description) THEN 1 ELSE 0 END = 1)
上記のコードは、実際に検索する値がない限り、フルテキスト クエリ ピースが実行されないようにする必要があります。
私の質問は、 @Description が'""'
であるこのクエリを実行すると、そのテーブルと検索がまったく使用されなくても、クラスター化されたインデックスのシークと fulltextmatch の処理に費やされる実行計画にかなりの時間がまだあるということです。これを回避する方法はありますか?
これをハードコードされた動的クエリからストアド プロシージャに取り込もうとしていますが、プロシージャが遅くなった場合、それを正当化できるかどうかわかりません。