Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Резкое снижение скорости выполнения пользовательской скалярной функции  [new]
Berkly
Member

Откуда:
Сообщений: 3
Доброго дня.

Происходит следующее: Создал функцию

CREATE Function [dbo].[GetRestOfficeItem](@Date TDate, @Item_Date TDate, @Item_User TUser, @Office_Date TDate, @Office_User TUser, @WithReserv bit)
Returns TCount AS
Begin

Declare @Rest TCount

Select @Rest = [Count]
From Rests
Where (Item_Date = @Item_Date) And (Item_User = @Item_User) And (Office_Date = @Office_Date) And (Office_User = @Office_User)

Declare @Delta TCount

Select @Delta = Sum([Count])
From Rest
Where (Date >= @Date + 1) And (Item_Date = @Item_Date) And (Item_User = @Item_User) And (Office_Date = @Office_Date) And (Office_User = @Office_User)

Declare @Reserv TCount

if (@WithReserv = 0) Set @Reserv = dbo.GetReservOfficeItem(@Date, @Item_Date, @Item_User, @Office_Date, @Office_User)

Return IsNull(@Rest, 0) - IsNull(@Delta, 0) - IsNull(@Reserv, 0)

End

скорость выполнения максимум 5 мс и количество считанных записей в среднем 1500, проходит время недели две, скорость резко падает до 163 мс и количество записей становится в среднем 80000. Производишь Alter все становиться нормально. Может кто сталкивался?
18 дек 12, 12:13    [13647870]     Ответить | Цитировать Сообщить модератору
 Re: Резкое снижение скорости выполнения пользовательской скалярной функции  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Berkly
количество считанных записей в среднем 1500, проходит время недели две, ... количество записей становится в среднем 80000

Каким образом вы определили количество считанных записей?
18 дек 12, 12:20    [13647921]     Ответить | Цитировать Сообщить модератору
 Re: Резкое снижение скорости выполнения пользовательской скалярной функции  [new]
Berkly
Member

Откуда:
Сообщений: 3
Гость333,

SQL Server Profiler
18 дек 12, 12:21    [13647928]     Ответить | Цитировать Сообщить модератору
 Re: Резкое снижение скорости выполнения пользовательской скалярной функции  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Berkly,

Могут меняться планы выполнения запросов, входящих в функцию. Посмотреть планы выполнения можно тем же профайлером.
18 дек 12, 12:32    [13647984]     Ответить | Цитировать Сообщить модератору
 Re: Резкое снижение скорости выполнения пользовательской скалярной функции  [new]
_djХомяГ
Guest
parameter-sniffing
18 дек 12, 12:47    [13648075]     Ответить | Цитировать Сообщить модератору
 Re: Резкое снижение скорости выполнения пользовательской скалярной функции  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Berkly,

переделайте функцию в inline table valued. Будет летать.
Скалярные UDF - сами по себе тормоза.
18 дек 12, 12:50    [13648092]     Ответить | Цитировать Сообщить модератору
 Re: Резкое снижение скорости выполнения пользовательской скалярной функции  [new]
aleks2
Guest
iap
Berkly,

переделайте функцию в inline table valued. Будет летать.
Скалярные UDF - сами по себе тормоза.

Ты не прав.
В некоторых случаях - быстрее.

ЗЫ. Хотя здесь не тот случай...
18 дек 12, 13:37    [13648431]     Ответить | Цитировать Сообщить модератору
 Re: Резкое снижение скорости выполнения пользовательской скалярной функции  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
aleks2
В некоторых случаях - быстрее.

можно пример?
18 дек 12, 13:58    [13648575]     Ответить | Цитировать Сообщить модератору
 Re: Резкое снижение скорости выполнения пользовательской скалярной функции  [new]
Crimean
Member

Откуда:
Сообщений: 13147
Knyazev Alexey,

бывает, когда надо "спрятать" от оптимизатора сложный кусок кода
но и тогда применение будет весьма ограниченным и специфичным
скажем, не where field = dbo.f1() а where field = (select dbo.f1()) как минимум
а то, бывает, приходится и через доп.таблицу с ПК (а бывает что и через фейковую) это разворачивать - тогда можно получить профит
18 дек 12, 14:04    [13648647]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить