我遇到了一个关于表值函数性能的奇怪情况。基本上,我有一个内联表值函数,它以DATETIME为参数。
它大致看起来像这样(不完全相同):
CREATE FUNCTION fn_MyFunction(@StartDate DATETIME)
RETURNS TABLE
AS
RETURN (
SELECT COUNT(*), CustomerID, SUM(PAID)
FROM Orders
WHERE OrderDate > @StartDate
GROUP BY CustomerID
)
现在,我正在调查一个问题,即这个查询运行时间超过了1分钟。事实证明,如果我以这种方式调用查询:
SELECT * FROM fn_MyFunction('7/1/2011')
运行时间超过1分钟
然而,如果我以这种方式调用查询:
DECLARE @startDate DATETIME = '7/1/2011'
SELECT * FROM fn_MyFunction(@startDate)
它可以在一秒钟内运行完。SQL Server针对这两种调用使用了完全不同的执行计划。
显然,我希望它能一直采用第二种方法,但不幸的是,我通过LINQ 2 SQL调用了这个表值函数,而它不会声明中间变量。
有没有办法在行内表值函数中使用中间变量?我真的不想将其转换为多行表值函数。欢迎提出其他想法。我有点困惑。
SELECT * FROM fn_MyFunction('7/1/2011')
超过一次? - John DeweySELECT * FROM fn_MyFunction('7/1/2011') OPTION (RECOMPILE)
。如果这不起作用,可能需要更新Orders
的统计信息。 - Martin Smith