私はこれとしばらく戦っています。フィルタリングに使用される3つのパラメーターを受け取るストアドプロシージャがあります。特定の値が渡された場合、それをフィルタリングしたいと思います。-1が渡されたら、全部ください。
私はそれを次の2つの方法で試しました:
最初の方法:
SELECT field1, field2...etc
FROM my_view
WHERE
parm1 = CASE WHEN @PARM1= -1 THEN parm1 ELSE @PARM1 END
AND parm2 = CASE WHEN @PARM2 = -1 THEN parm2 ELSE @PARM2 END
AND parm3 = CASE WHEN @PARM3 = -1 THEN parm3 ELSE @PARM3 END
2番目の方法:
SELECT field1, field2...etc
FROM my_view
WHERE
(@PARM1 = -1 OR parm1 = @PARM1)
AND (@PARM2 = -1 OR parm2 = @PARM2)
AND (@PARM3 = -1 OR parm3 = @PARM3)
私はどこかで、2番目の方法が短絡し、trueの場合は2番目の部分を評価しないことを読みました。私のDBAは、テーブルスキャンを強制すると言いました。私はこれを確認していませんが、場合によっては実行が遅くなるようです。
このビューが選択するメインテーブルには約150万のレコードがあり、ビューは他の約15のテーブルに結合して、他の多くの情報を収集します。
これらの方法はどちらも遅いです...私を瞬時から2〜40秒のどこかに連れて行ってくれますが、これは私の状況ではまったく受け入れられません。
それを特定の対-1のそれぞれの別々のケースに分解することを含まないより良い方法はありますか?
どんな助けでも大歓迎です。ありがとう。