У меня странный сценарий с производительностью табличной функции. По сути, у меня есть встроенная табличная функция, которая принимает 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 использует совершенно разные планы объяснения для обоих вызовов.
Очевидно, я хочу, чтобы он выполнял второй метод все время, к сожалению, я вызываю эту табличную функцию через SQL LINQ 2, который не объявляет временную переменную.
Есть ли способ использовать временную переменную во встроенной табличной функции? Я действительно не хочу преобразовывать это в многострочную табличную функцию. Другие идеи также приветствуются. Я немного озадачен.