Передача параметра даты во встроенную табличную функцию - sloooww - PullRequest
4 голосов
/ 20 марта 2012

У меня странный сценарий с производительностью табличной функции. По сути, у меня есть встроенная табличная функция, которая принимает 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, который не объявляет временную переменную.

Есть ли способ использовать временную переменную во встроенной табличной функции? Я действительно не хочу преобразовывать это в многострочную табличную функцию. Другие идеи также приветствуются. Я немного озадачен.

Ответы [ 2 ]

1 голос
/ 21 марта 2012

Я пробовал это с большим количеством записей, и оба способа возвращали значения за 9 секунд, без разницы ...

это длинный выстрел, но можно проверить, дает ли неявное приведениеиспользовать то же значение даты, что и явное приведение?Попробуйте с датой, например «2011/1/30», чтобы у вас были проблемы с конверсией в месяц / день

0 голосов
/ 12 ноября 2012

Добавление OPTION (RECOMPILE) решит вашу проблему.У меня точно такая же проблема с встроенным TVF:1007 *

Добавление OPTION (RECOMPILE) ко второму вызову решает проблему.

Из того, что я могу сказать, использование параметра datetime каким-то образом приводит к совершенно другому плану выполнения.Мне было бы интересно узнать, почему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...