1

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の評価を回避するにはどうすればよいですか?

4

1 に答える 1

3

これを回避する唯一の方法は、クエリを複製することだと思います

if (@bSomeSpecialCheck = 'Y') Then
begin
   Whole Query with function
end
else
begin
  Whole Query without function
end 
于 2012-11-18T00:05:14.017 に答える