私には2つの関数があります:fn_Without_Paramとfn_With_Param
CREATE FUNCTION [dbo].[fn_Without_Param]
(
)
...
INNER JOIN .. ON .. AND SubmitDate = CONVERT( varchar(10), GETUTCDATE(), 101 )
そして
/*
I am requesting it so:
declare @SubmitDate datetime
set @SubmitDate = CONVERT( varchar(10), GETUTCDATE(), 101 )
select * from [dbo].[fn_With_Param] (@SubmitDate)
*/
CREATE FUNCTION [dbo].[fn_With_Param]
(
@SubmitDate datetime
)
...
INNER JOIN .. ON .. AND SubmitDate = @SubmitDate
最初のケースでは、非決定論的(?)関数(GETUTCDATEのため)があり、同じ入力パラメーター(CONVERT(varchar(10)、GETUTCDATE()、101)で2番目の関数を呼び出しました-今日の日付を時間、分なしで意味します、秒、ミリ秒)。私の関数は非決定論的なものですか?これを検出する方法、多分SQLサーバーはいくつかのパブリックマークを持っています。 2番目の関数が遅いのはなぜですか?
フラグがあるかどうかはわかりませんが、 http://msdn.Microsoft.com/en-us/library/ms178091.aspx に参照があり、その組み込み関数は次のとおりです。決定論的。
GETDATE()とGETUTCDATE()は、同じパラメーター(この場合はnone)を使用して複数回呼び出すと、異なる値を取得するため、非決定的です。つまり、戻り値は入力によって決定されません。
2番目が最初より遅い理由については、SubmitDate = @ SubmitDate間の暗黙的な変換を確認してください。どちらも日時ですか?