私はいくつかのパフォーマンステストを行っていましたが、かなり奇妙なことを発見しました。特定のアクションの実行にかかる時間を計測するための短いスクリプトを設定しました。
declare @date date
declare @someint int
declare @start datetime
declare @ended datetime
set @date = GETDATE()
DECLARE @count INT
SET @count = 0
set @start = GETDATE()
WHILE (@count < 1000)
BEGIN
--Insert test script here
END
set @ended = GETDATE()
select DATEDIFF( MILLISECOND, @start, @ended)
テストを実行していたテーブルには、、、MDay
およびの3つの列が含まれていますCalDate
。すべての暦日には、対応するM(製造)日があります。テーブルは次のようになります。
MDay | CalDate
1 | 1970-01-01
2 | 1970-01-02
私たちの関数の1つがどれほど効率的であるかをテストしたかったのです。この関数は単にaを取り込んでdate
、値を返しint MDay
ます。私は直接アクセスを使用しましたが、基本的には関数なしで同じものでしたが、テストの結果、このメソッドには2倍の時間がかかりました。ループに挿入したコードを以下に示します。キャッシュを排除するためにランダムな日付を使用しました(存在する場合)。
働き
select @someint = Reference.GetMDay(DATEADD( D, convert(int, RAND() * 1000) , @date))
上記の定義
create Function [Reference].[GetMDay]
(@pCaLDate smalldatetime
)
Returns int
as
Begin
Declare @Mday int
Select @Mday = Mday
from Reference.MDay
where Caldate = @pCaLDate
直接
select @someint = MDay from Reference.MDay where CalDate = DATEADD( D, convert(int, RAND() * 1000) , @date)
直接コードに静的コードを使用してみましたが、時間の違いはごくわずかであるため、呼び出しがそれを妨げていないことが@date
わかります。convert
ここで一体何が起こっているのですか?