Я тоже нуждался в этом. У меня было две функции, которые возвращали количество обращений к хранимой процедуре, которая собирала список всех пользователей и их количество обращений.
По линиям
select name, userID, fnCaseCount(userID), fnRefCount(UserID)
from table1 t1
left join table2 t2
on t1.userID = t2.UserID
Для относительно небольшого набора (400 пользователей) он вызывал каждую из двух функций по одному разу. В общей сложности это 800 вызовов из хранимой процедуры. Не очень, но никто не ожидал, что у сервера sql возникнут проблемы с таким количеством вызовов.
Это заняло более 4 минут.
Индивидуально вызов функции был почти мгновенным. Даже 800 почти мгновенных вызовов должны быть почти мгновенными.
Все индексы были на месте, и SSMS не предложила новых индексов, когда план выполнения анализировался как для хранимой процедуры, так и для функций.
Я скопировал код из функции и поместил его в запрос SQL в хранимой процедуре. Но похоже, что переход между sp и function - это то, что пожирает время.
Время выполнения все еще слишком велико и составляет 18 секунд, но позволяет выполнить запрос в течение нашего 30-секундного интервала ожидания.
Если бы у меня была подпроцедура, это сделало бы код красивее, но все равно могло бы добавить издержки.
Затем я могу попробовать перенести те же функции в представление, которое можно использовать в объединении.
select t1.UserID, t2.name, v1.CaseCount, v2.RefCount
from table1 t1
left join table2 t2
on t1.userID = t2.UserID
left join vwCaseCount v1
on v1.UserID = t1.UserID
left join vwRefCount v2
on v2.UserID = t1.UserID
Хорошо, я только что создал представления из функций, поэтому мое время выполнения увеличилось с 4 минут до 18 секунд до 8 секунд. Я буду продолжать играть с этим.