SQL Server 2012では、次のwhere句を持つ大きなクエリがあります。
(1 = Case
When (@bSomeSpecialCheck = 'Y') Then
Case When (dbo.SomeFunction(SomeColumn, @SomeParam)=1) Then 1 Else 0 End
Else 1 End)
「SomeFunction」は遅いので、@SomeParamに値がある場合にのみ評価してほしいと思います。必要がなければ「SomeFunction」の実行を避けたいので、このようにwhereを記述しました。
@bSomeSpecialCheckが常に「N」であるかどうかに関係なく、SQL Serverはケース全体を評価しているように見えます。これは、テスト目的でこのように記述した場合です。
(1 = Case
When (@bSomeSpecialCheck = 'Y') Then
Case When (1=1) Then 1 Else 0 End
Else 1 End)
すぐに応答が返ってきたので、遅い関数「SomeFunction」が評価されていることがわかりましたが、なぜですか?@bSomeSpecialCheckが「Y」の場合にのみSomeFunctionの評価を回避するにはどうすればよいですか?