Почему простая функция T-SQL UDF замедляет выполнение кода в 3 раза - PullRequest
7 голосов
/ 07 августа 2009

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

Функция очень проста:

ALTER FUNCTION [dbo].[GetDateDifferenceInDays] 
(       
@first_date SMALLDATETIME, 
@second_date SMALLDATETIME
)
RETURNS INT 
AS
BEGIN 

RETURN ABS(DATEDIFF(DAY, @first_date, @second_date))

END

Итак, у меня есть два одинаковых запроса, но один использует функцию, а другой выполняет вычисления в самом запросе:

ABS(DATEDIFF(DAY, [mytable].first_date, [mytable].second_date))

Теперь запрос со встроенным кодом выполняется в 3 раза быстрее, чем тот, который использует функцию.

Ответы [ 3 ]

14 голосов
/ 07 августа 2009

Имеется скалярный UDF (принимает от 0 до n параметров и возвращает скалярное значение). Такие пользовательские функции, как правило, вызывают построчную операцию вашего запроса, если только она не вызывается с постоянными параметрами, что в точности приводит к снижению производительности вашего запроса.

См. здесь , здесь и здесь для подробного объяснения ловушек производительности при использовании UDF.

13 голосов
/ 07 августа 2009

Не используйте медленный скалярный UDF, используйте быстрый встроенный.Примеры здесь:

Повторное использование вашего кода с табличными UDF

Вычисление третьей среды месяца с встроенными UDF

Многие вложенные встроенные пользовательские функции очень быстрые

Вопрос очень распространенный: его задавали и отвечали сотни раз раньше, поэтому он имеет несколько стандартных ответов.

5 голосов
/ 07 августа 2009

В зависимости от контекста использования оптимизатор запросов может анализировать встроенный код и составлять отличный план запроса с использованием индексов, в то время как он не «встроен в функцию» для аналогичного подробного анализа и поэтому заканчивается плохой план запроса, когда функция задействована. Посмотрите на два плана запросов бок о бок, и вы сможете довольно легко подтвердить (или опровергнуть) эту гипотезу!

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