powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / inline-функции
8 сообщений из 8, страница 1 из 1
inline-функции
    #39920603
bolikdimon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.

Помогите пожалуйста разобраться с ньюансами использования inline-функций.
Допустим, есть inline функция которая возвращает некую табличку - dbo.GetTable()
Далее, есть запрос состоящий из двух операторов SELECT и оператора UNION ALL, в каждой ветке есть отдельный вызов одной и той же inline-функции:

SELECT ...
FROM dbo.GetTable()
UNION ALL
SELECT ...
FROM dbo.GetTable()
INNER JOIN...

Правильно ли я понимаю что запрос, содержащийся в inline-функции будет в данном случае вызываться дважды?
Есть ли смысл, с целью улучшения производительности, предварительно перекинуть данные функции dbo.GetTable() во временную табличку, а уже затем использовать эту табличку в обеих ветках запроса UNION ALL ?

Спасибо!
...
Рейтинг: 0 / 0
inline-функции
    #39920606
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bolikdimon
Правильно ли я понимаю что запрос, содержащийся в inline-функции будет в данном случае вызываться дважды?

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

Сотрите план выполнения.
...
Рейтинг: 0 / 0
inline-функции
    #39920638
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLex
Физически - далеко не факт. Результат выполнения вполне может быть сохранен самим движком во "временную" таблицу.
Это же нарушит логику запроса, если функция недетерминированная.
А она недетерминированная, судя по названию.
Так что только через времянку.
...
Рейтинг: 0 / 0
inline-функции
    #39920641
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg
msLex
Физически - далеко не факт. Результат выполнения вполне может быть сохранен самим движком во "временную" таблицу.
Это же нарушит логику запроса, если функция недетерминированная.
А она недетерминированная, судя по названию.
Так что только через времянку.

То, что написано у тредстартера, можно одним джойном создать.

Юнион - это больная фантазия
...
Рейтинг: 0 / 0
inline-функции
    #39920647
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg
Это же нарушит логику запроса, если функция недетерминированная.

С чего это? Это же inline функция, она просто подставится в запрос, а позже произойдет его (запроса) оптимизация.

Это запрос эквивалентен

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
;with cte as(
--тут запрос из функции 
) 
select ...
from cte
union all
select ...
from cte
inner join 



Если движок "посчитает", что выгоднее один раз заспулить результат выполнения этого запрос чем выполнять его дважды, то логика запроса ему это не запрещает (но и не требует).
...
Рейтинг: 0 / 0
inline-функции
    #39920686
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLex
Если движок "посчитает", что выгоднее один раз заспулить результат выполнения этого запрос чем выполнять его дважды, то логика запроса ему это не запрещает (но и не требует).
Может, это я перемудрил?
Использовать в инлайн функции newid() нельзя, но, допустим, есть запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
;with cte as(
    select max(id) from T (nolock)
) 
select ...
from cte
union all
select ...
from cte
inner join 

По идее, тут план с двумя выборками из T может вернуть 2 разных значения (если в другом коннекте вставили запись во время выполнения этого запроса).
Или это уж совсем фантазии?
...
Рейтинг: 0 / 0
inline-функции
    #39920702
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разве текст inline функции не подставляется сервером перед оптимизацией
с подставленными значениями параметров в запрос вместо функции?
Я это так себе представлял. Устарел я, да? Или вообще заблуждался?
...
Рейтинг: 0 / 0
inline-функции
    #39920914
bolikdimon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222

То, что написано у тредстартера, можно одним джойном создать.
Юнион - это больная фантазия


Пример запроса я очень упрощенный привел. В реальной задаче строится рекурсивный CTE, поэтому используется UNION, а в его обеих ветках вызывается одна и та же inline-функция. Т.е. на самом деле вызовов функции даже не два, а гораздо больше, за счет рекурсии.
В общем на данный момент просто перекину рез-т функции во временную табличку.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / inline-функции
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]