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)

我运行测试的表包含 3 列MDay, 和CalDate。每个日历日期都有一个对应的 M(制造)日。该表可能如下所示:

MDay  |  CalDate
  1   | 1970-01-01
  2   | 1970-01-02

我想测试我们的一项功能的效率。这个函数只接受 adate并返回int MDay值。我用的是直接访问,没有这个功能基本是一样的,结果这个方法的测试时间是原来的两倍!下面提供了我插入循环的代码。我使用随机日期试图消除缓存(如果存在)。

功能

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 server 上的执行计划是一样的吗?

于 2013-02-08T18:35:06.743 回答