2012-04-11 39 views
6

さまざまな計算で使用されるスカラー関数を含むselectステートメントがある場合、そのスカラー関数は複数回と呼ばれる?そうであれば、これを最適化する方法はありますか?私の実際のクエリでは1回につきX 6回、何千回も呼び出されるため、選択ごとに1回だけfuncitonを呼び出します。例えばselectステートメント内でスカラー関数を複数回呼び出すことは、関数を複数回実行しますか?その場合、回避する方法

SELECT 
[dbo].[fn_Days](@Account) + u.[DayRate], 
[dbo].[fn_Days](@Account)/u.[WorkDays] 
FROM [dbo].[tblUnit] u 

すべてfn_daysんが働いた日のint型を返すことです。

+0

私はそれがすべての行に対して実行されることを認識していますが、同じ行内で2​​回実行されているので、何とかその同じ値を使用できますか? – mameesh

+0

あなたのコメントを投稿した通りに気づいた。それは、理論的には、値を格納することができますが、私はそれが疑う。これを理解するには、意図的に実行に時間がかかる関数を作成し、それをクエリとして1回、クエリで2回呼び出し、実行時間を比較する方法があります。 – Corbin

+0

すでに関数の結果を列として結合している場合、クエリプランがどのようなものかを確認してください。 –

答えて

10

はいスカラーはコード化された方法で複数回呼び出されます。それは、このようなサブクエリにそれをラップすることです動作させるための一つの方法:

SELECT t.[days] + t.[DayRate], 
     t.[days]/t.[WorkDays] 
FROM (
    SELECT 
    [dbo].[fn_Days](@Account) as days, 
    u.[DayRate], 
    u.[WorkDays] 
    FROM [dbo].[tblUnit] u) as t 

この方法の一度だけの行ごとに呼び出されますfn_Daysではなく、二回、またはあなたが言及したように6回。

これが役に立ちます。

2

関数は確定的です。つまり、関数は常に、指定されたパラメータに対して同じ値を返します。変数をパラメータとして使用しているため、クエリを実行する前に一度関数を呼び出して、その関数を呼び出す代わりにクエリで結果を使用することができます。

DECLARE @Days int 
SET @Days = [dbo].[fn_Days](@Account) 

SELECT 
    @Days + u.[DayRate], 
    @Days/u.[WorkDays] 
FROM [dbo].[tblUnit] u 
関連する問題