直接访问比使用函数慢?

时间:2013-02-08 18:30:42

标签: sql sql-server performance

我正在进行一些性能测试,发现了一些很奇怪的东西。我已经设置了一个简短的脚本来计算执行某些操作所需的时间。

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列,MDayCalDate。每个日历日期都有相应的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调用并没有阻止它。 到底发生了什么事?

1 个答案:

答案 0 :(得分:0)

看看http://msdn.microsoft.com/en-us/library/ms178071%28v=sql.105%29.aspx两个方法在sql server上的执行计划是否相同?