我正在进行一些性能测试,发现了一些很奇怪的东西。我已经设置了一个简短的脚本来计算执行某些操作所需的时间。
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
我想测试我们的一个功能是多么有效。此函数只需要date
并返回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
调用并没有阻止它。
到底发生了什么事?
答案 0 :(得分:0)
看看http://msdn.microsoft.com/en-us/library/ms178071%28v=sql.105%29.aspx两个方法在sql server上的执行计划是否相同?