我正在进行一些性能测试,发现了一些非常奇怪的东西。我已经设置了一个简短的脚本来计算执行某些操作需要多长时间。
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
调用并没有阻止它。这到底是怎么回事?