将日期参数传递给内嵌表值函数很慢

Lin*_*nus 5 sql t-sql sql-server-2005 sql-server-2008

我在表值函数的性能方面遇到了一个奇怪的场景。基本上,我有一个内联表值函数,它将 DATETIME 作为参数。

它看起来像这样(不完全是这样):

  CREATE FUNCTION fn_MyFunction(@StartDate DATETIME)
  RETURNS TABLE
  AS
  RETURN (
    SELECT COUNT(*), CustomerID, SUM(PAID)
    FROM Orders   
    WHERE OrderDate > @StartDate
    GROUP BY CustomerID
  )
Run Code Online (Sandbox Code Playgroud)

现在,我正在尝试调查此查询运行时间超过 1 分钟的问题。事实证明,如果我这样调用查询:

SELECT * FROM fn_MyFunction('7/1/2011')
Run Code Online (Sandbox Code Playgroud)

它运行 > 1 分钟。

但是,如果我这样调用查询:

DECLARE @startDate DATETIME = '7/1/2011'
SELECT * FROM fn_MyFunction(@startDate)
Run Code Online (Sandbox Code Playgroud)

它在一秒钟内运行。SQL Server 对这两个调用使用完全不同的解释计划。

显然,我希望它一直执行第二种方法,不幸的是,我通过 LINQ 2 SQL 调用这个表值函数,它不会声明临时变量。

有没有办法在内联表值函数中使用临时变量?我真的不想将其转换为多行表值函数。其他想法也将受到欢迎。我有点难住了。

小智 1

我用大量记录尝试过,两种方法都在 9 秒内返回值,没有区别......

这是一个远景,但可以测试一下隐式转换是否为函数提供了与显式转换相同的日期值?尝试使用“2011/1/30”这样的日期,这样您就会遇到月/日转换问题