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

Откуда: Минск
Сообщений: 1755
Есть два запроса.
В 1-ом используется функция.
Во 2-ом вместо нее OUTER APPLY
План показывает что на 1-ый запрос надо 0%, а на второй 100% по отношению друг к другу. Однако 2-ой запрос выполняется за 2 минуты, а 1-ый за 10 минут.

Что за странное поведение?

SELECT
  sro.Id_Outlet,
  srra.Id_Goods,
  dbo.GetDiscount(NULL, srra.Id_Goods, fp.id_pogr, DATEADD(DAY, 1, GETDATE()))
FROM
  Syn_RTLAgent_Outlet sro
  JOIN Syn_RTLAgent_RecommendedAssortment srra
    ON srra.Id_Location = sro.Id_Location
  JOIN F_Pogr fp
    ON fp.id_cm_outlet = sro.Id_Outlet
WHERE
  srra.Id_Enterprise = 14 AND
  dbo.GetDiscount(NULL, srra.Id_Goods, fp.id_pogr, DATEADD(DAY, 1, GETDATE())) <> 0
    
SELECT
  sro.Id_Outlet,
  srra.Id_Goods,
  COALESCE(rez.[percent], rez2.[percent], 0)
FROM
  Syn_RTLAgent_Outlet sro
  JOIN Syn_RTLAgent_RecommendedAssortment srra
    ON srra.Id_Location = sro.Id_Location
  JOIN F_Pogr fp
    ON fp.id_cm_outlet = sro.Id_Outlet
  OUTER APPLY (SELECT
                 dd.[percent]
               FROM
                 Disc_Discount dd
               JOIN Disc_Periods dp
                 ON dp.id_disc_discount = dd.ID_disc_discount
               JOIN Disc_DopDiscount_fpogr dddf
                 ON dddf.id_disc_discount = dd.ID_disc_discount AND
                    dddf.id_disc_periods = dp.ID_disc_periods
               WHERE
                 DATEADD(DAY, 1, GETDATE()) BETWEEN dp.date_start AND dp.date_end AND
                 dd.id_partner = (SELECT TOP 1
                                    tsp.Id_Partner
                                  FROM
                                    T_Subgroup_Partner tsp
                                  JOIN T_Goods tg
                                    ON tg.id_SubGroup = tsp.Id_Subgroup
                                  WHERE tg.id_Goods = srra.Id_Goods AND
                                        tg.id_enterprise = srra.Id_Enterprise) AND
                 dd.typediscount = 1 AND
                 dp.isActive = 1 AND
                 dddf.id_pogr = fp.id_pogr AND
                 dddf.id_goods = srra.Id_Goods) rez
  OUTER APPLY (SELECT
                 dd.[percent]
               FROM
                 Disc_Discount dd
               JOIN Disc_Periods dp
                 ON dp.id_disc_discount = dd.ID_disc_discount
               JOIN Disc_StdDiscount_fpogr dsdf
                 ON dsdf.id_disc_discount = dd.ID_disc_discount
               WHERE
                 dd.typediscount = 0 AND
                 DATEADD(DAY, 1, GETDATE()) BETWEEN dp.date_start AND dp.date_end AND
                 dd.id_partner = (SELECT TOP 1
                                    tsp.Id_Partner
                                  FROM
                                    T_Subgroup_Partner tsp
                                  JOIN T_Goods tg
                                    ON tg.id_SubGroup = tsp.Id_Subgroup
                                  WHERE tg.id_Goods = srra.Id_Goods AND
                                        tg.id_enterprise = srra.Id_Enterprise) AND
                 dp.isActive = 1 AND
                 dsdf.id_pogr = fp.id_pogr) rez2
WHERE
  srra.Id_Enterprise = 14 AND
  COALESCE(rez.[percent], rez2.[percent], 0) <> 0
13 июн 13, 19:30    [14430396]     Ответить | Цитировать Сообщить модератору
 Re: OUTER APPLY против функций  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
X-Cite,

Скалярные функции не отражают реальной стоимости, для оптимизатора - это самый темный лес, который только может быть.
Это одна из причин, почему не стоит доверять процентам.
13 июн 13, 19:34    [14430407]     Ответить | Цитировать Сообщить модератору
 Re: OUTER APPLY против функций  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Потому что прохалаявили и не сделали INLINE скалярки.
Но с другой стороны, параметризованные представления просто не привычно писать, удобство тоже (даже лучше).
И ваш OUTER APPLY как раз и нужно засунуть в такую функцию.
13 июн 13, 21:38    [14430761]     Ответить | Цитировать Сообщить модератору
 Re: OUTER APPLY против функций  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Mnior
Потому что прохалаявили и не сделали INLINE скалярки.

Не оговорились? Меня интересует эта тема.
Могут ли быть скалярные функции инлайн? Разумеется, именно скалярные функции.
Вот есть предложение на коннекте The Scalar Expression function would speed performance while keeping the benefits of functions.
И вот что еще нашел iap Существуют ли inline scalar functions
?
13 июн 13, 22:05    [14430808]     Ответить | Цитировать Сообщить модератору
 Re: OUTER APPLY против функций  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Fix
Mnior
Потому что MS прохалаявили и не сделали INLINE скалярки.
Я проглатываю не только буквы, слоги, но и слова и целые предложения.
14 июн 13, 00:24    [14431254]     Ответить | Цитировать Сообщить модератору
 Re: OUTER APPLY против функций  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Mnior,

Ясно.
Да, MS прохалявили, и ведь вроде собирались, зачем иначе добавляли "IS: inline scalar function". Эх...
14 июн 13, 01:03    [14431365]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить