|
inline-функции
|
|||
---|---|---|---|
#18+
Здравствуйте. Помогите пожалуйста разобраться с ньюансами использования 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 ? Спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
30.01.2020, 17:30 |
|
inline-функции
|
|||
---|---|---|---|
#18+
bolikdimon Правильно ли я понимаю что запрос, содержащийся в inline-функции будет в данном случае вызываться дважды? Логически - да. Физически - далеко не факт. Результат выполнения вполне может быть сохранен самим движком во "временную" таблицу. Сотрите план выполнения. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.01.2020, 17:34 |
|
inline-функции
|
|||
---|---|---|---|
#18+
msLex Физически - далеко не факт. Результат выполнения вполне может быть сохранен самим движком во "временную" таблицу. А она недетерминированная, судя по названию. Так что только через времянку. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.01.2020, 18:14 |
|
inline-функции
|
|||
---|---|---|---|
#18+
alexeyvg msLex Физически - далеко не факт. Результат выполнения вполне может быть сохранен самим движком во "временную" таблицу. А она недетерминированная, судя по названию. Так что только через времянку. То, что написано у тредстартера, можно одним джойном создать. Юнион - это больная фантазия ... |
|||
:
Нравится:
Не нравится:
|
|||
30.01.2020, 18:17 |
|
inline-функции
|
|||
---|---|---|---|
#18+
alexeyvg Это же нарушит логику запроса, если функция недетерминированная. С чего это? Это же inline функция, она просто подставится в запрос, а позже произойдет его (запроса) оптимизация. Это запрос эквивалентен Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
Если движок "посчитает", что выгоднее один раз заспулить результат выполнения этого запрос чем выполнять его дважды, то логика запроса ему это не запрещает (но и не требует). ... |
|||
:
Нравится:
Не нравится:
|
|||
30.01.2020, 18:23 |
|
inline-функции
|
|||
---|---|---|---|
#18+
msLex Если движок "посчитает", что выгоднее один раз заспулить результат выполнения этого запрос чем выполнять его дважды, то логика запроса ему это не запрещает (но и не требует). Использовать в инлайн функции newid() нельзя, но, допустим, есть запрос: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
По идее, тут план с двумя выборками из T может вернуть 2 разных значения (если в другом коннекте вставили запись во время выполнения этого запроса). Или это уж совсем фантазии? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.01.2020, 19:27 |
|
inline-функции
|
|||
---|---|---|---|
#18+
Разве текст inline функции не подставляется сервером перед оптимизацией с подставленными значениями параметров в запрос вместо функции? Я это так себе представлял. Устарел я, да? Или вообще заблуждался? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.01.2020, 19:56 |
|
inline-функции
|
|||
---|---|---|---|
#18+
aleks222 То, что написано у тредстартера, можно одним джойном создать. Юнион - это больная фантазия Пример запроса я очень упрощенный привел. В реальной задаче строится рекурсивный CTE, поэтому используется UNION, а в его обеих ветках вызывается одна и та же inline-функция. Т.е. на самом деле вызовов функции даже не два, а гораздо больше, за счет рекурсии. В общем на данный момент просто перекину рез-т функции во временную табличку. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.01.2020, 10:12 |
|
|
start [/forum/topic.php?fid=46&msg=39920606&tid=1686576]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
52ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
38ms |
get tp. blocked users: |
1ms |
others: | 16ms |
total: | 146ms |
0 / 0 |