2

私はいくつかのパフォーマンステストを行っていましたが、かなり奇妙なことを発見しました。特定のアクションの実行にかかる時間を計測するための短いスクリプトを設定しました。

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ここで一体何が起こっているのですか?

4

1 に答える 1

0

http://msdn.microsoft.com/en-us/library/ms178071%28v=sql.105%29.aspxをご覧ください。実行計画は両方の方法で SQL サーバー上で同じですか?

于 2013-02-08T18:35:06.743 に答える