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

Откуда:
Сообщений: 930
Здравствуйте!
В чем практическое отличие многооператорной функции возвращающей табличное значение от встроенная функции, возвращающей табличное значение? Прочитал по этому поводу BOL, MSDN, нашел даже интересную статью. В общем, насколько я понял, разница между такими функциями заключается в том, что в первом случае функция возвращает локальную переменную типа table, а в другом случае происходит возврат не локальной переменной, а набора данных, определяемым оператором SELECT.
Еще в упомянутой статье говорится об "однострочных табличнозначных функциях". Как я понял это тоже что и встроенная функция, возвращающей табличное значение.
Так и практической разницы для их применения я так и не увидел.

К сообщению приложен файл. Размер - 0Kb
15 сен 09, 12:25    [7660157]     Ответить | Цитировать Сообщить модератору
 Re: Многооператорная функция и встроенная функция, возвращающие табличные значения  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

сервер внутри их по-разному обрабатывает.
встроенные (inline) функции во многом аналогичны представлениям (view).
собственно, иногда их так и называют - "параметризированными представлениями".
когда сервер обрабатывает запрос с inline-функцией, он "встраивает" текст
функции в основной запрос и уже целиком для получившегося запроса
строится план выполнения.
многооператорные же функции аналогичны процедурам. они уже по-настоящему выполняются.

Posted via ActualForum NNTP Server 1.4

15 сен 09, 13:03    [7660532]     Ответить | Цитировать Сообщить модератору
 Re: Многооператорная функция и встроенная функция, возвращающие табличные значения  [new]
rsolanov
Member

Откуда:
Сообщений: 930
То есть в случае с in-line функциями план получившегося запроса всегда строится заново, а для многооператорных функций план строится один раз, соответственно план запроса не перестараивается. Все так? И я ни где не нашел почему функции получили название "in-line". С чем это связано?
15 сен 09, 14:09    [7661191]     Ответить | Цитировать Сообщить модератору
 Re: Многооператорная функция и встроенная функция, возвращающие табличные значения  [new]
Glory
Member

Откуда:
Сообщений: 104760
rsolanov
То есть в случае с in-line функциями план получившегося запроса всегда строится заново, а для многооператорных функций план строится один раз, соответственно план запроса не перестараивается. Все так? И я ни где не нашел почему функции получили название "in-line". С чем это связано?

Для in-line функции текст ее запроса участвует в создании плана.
Другие функций в создании плана участвуют как "черные ящики" и оцениваются оптимизатором всегда одинаково
15 сен 09, 14:13    [7661232]     Ответить | Цитировать Сообщить модератору
 Re: Многооператорная функция и встроенная функция, возвращающие табличные значения  [new]
rsolanov
Member

Откуда:
Сообщений: 930
А какой тип функций в каких случаях предпочтительней использовать?
15 сен 09, 14:23    [7661350]     Ответить | Цитировать Сообщить модератору
 Re: Многооператорная функция и встроенная функция, возвращающие табличные значения  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> И я ни где не нашел почему функции получили название "in-line". С чем это связано?

ну так, как раз потому, что такая функция сама по себе не выполняется, а ее определение
встраивается (inline - встроенный) в запрос.

Posted via ActualForum NNTP Server 1.4

15 сен 09, 14:23    [7661356]     Ответить | Цитировать Сообщить модератору
 Re: Многооператорная функция и встроенная функция, возвращающие табличные значения  [new]
iljy
Member

Откуда:
Сообщений: 8711
rsolanov
А какой тип функций в каких случаях предпочтительней использовать?



во всех случаях, когда это возможно - предпочтительней использовать inline, даже вместо скалярных функций.
15 сен 09, 14:30    [7661448]     Ответить | Цитировать Сообщить модератору
 Re: Многооператорная функция и встроенная функция, возвращающие табличные значения  [new]
rsolanov
Member

Откуда:
Сообщений: 930
iljy
rsolanov
А какой тип функций в каких случаях предпочтительней использовать?



во всех случаях, когда это возможно - предпочтительней использовать inline, даже вместо скалярных функций.

Но тогда план будет каждый раз перестраиваться и большой скорости от этого не получить.
15 сен 09, 14:34    [7661514]     Ответить | Цитировать Сообщить модератору
 Re: Многооператорная функция и встроенная функция, возвращающие табличные значения  [new]
Glory
Member

Откуда:
Сообщений: 104760
rsolanov

Но тогда план будет каждый раз перестраиваться и большой скорости от этого не получить.

Почему каждый раз ?
15 сен 09, 14:37    [7661538]     Ответить | Цитировать Сообщить модератору
 Re: Многооператорная функция и встроенная функция, возвращающие табличные значения  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> Но тогда план будет каждый раз перестраиваться и большой скорости от
> этого не получить.

брррр. вы круглое с кислым сравниваете. у inline-функции своего плана
вообще нет. у каждого нового (отличного от ранее выполненных) запроса
с использованием inline-функции разумеется будет новый свой собственный
план. который ничто не мешает использовать повторно, если надо.

Posted via ActualForum NNTP Server 1.4

15 сен 09, 14:39    [7661555]     Ответить | Цитировать Сообщить модератору
 Re: Многооператорная функция и встроенная функция, возвращающие табличные значения  [new]
iljy
Member

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

план нового запроса у вас и так будет перестраиваться, и потери будут не существенные. а вот по производительности выигрыш можно получить более чем приличный. Простейший пример - когда у вас WHERE накладывается на результат функции - для inline условие будет применено сразу, а для многострочной - сначала все будет выбрано во временную таблицу, а потом уже к ней будут применяться условия.

вообще тут много раз это обсуждалось, и не только тут. В частности имеется выигрыш и для скалярной функции, хотя тут причина не очень ясна.
15 сен 09, 14:39    [7661557]     Ответить | Цитировать Сообщить модератору
 Re: Многооператорная функция и встроенная функция, возвращающие табличные значения  [new]
rsolanov
Member

Откуда:
Сообщений: 930
daw

> Но тогда план будет каждый раз перестраиваться и большой скорости от
> этого не получить.

брррр. вы круглое с кислым сравниваете. у inline-функции своего плана
вообще нет. у каждого нового (отличного от ранее выполненных) запроса
с использованием inline-функции разумеется будет новый свой собственный
план. который ничто не мешает использовать повторно, если надо.

Я имел в виду план общего, получившегося запроса. Просто я как понимаю что на создание нового плана исполнения затрачиваются определенные серверные ресурсы, поэтому в некоторых случаях мы можем получить увеличение времени выполнения запроса сервером.
15 сен 09, 15:27    [7662038]     Ответить | Цитировать Сообщить модератору
 Re: Многооператорная функция и встроенная функция, возвращающие табличные значения  [new]
iljy
Member

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

еще раз - план нового запроса у вас строится в любом случае, и использование инлайн-функции конечно может это время увеличить, но сильно сомневаюсь что вы это заметите. При повторном использовании того же запроса план перестраиваться не будет. А для неинлайн функции - ее план конечно построится один раз, но работать он может медленнее в разы.
Вообще - разговор заходит в тупик. Напишите 2 варианта и сравните.
15 сен 09, 15:33    [7662100]     Ответить | Цитировать Сообщить модератору
 Re: Многооператорная функция и встроенная функция, возвращающие табличные значения  [new]
Glory
Member

Откуда:
Сообщений: 104760
rsolanov
daw

> Но тогда план будет каждый раз перестраиваться и большой скорости от
> этого не получить.

брррр. вы круглое с кислым сравниваете. у inline-функции своего плана
вообще нет. у каждого нового (отличного от ранее выполненных) запроса
с использованием inline-функции разумеется будет новый свой собственный
план. который ничто не мешает использовать повторно, если надо.

Я имел в виду план общего, получившегося запроса. Просто я как понимаю что на создание нового плана исполнения затрачиваются определенные серверные ресурсы, поэтому в некоторых случаях мы можем получить увеличение времени выполнения запроса сервером.

План создается вообще то для любого запроса. Причем тут функции ?
15 сен 09, 15:34    [7662114]     Ответить | Цитировать Сообщить модератору
 Re: Многооператорная функция и встроенная функция, возвращающие табличные значения  [new]
rsolanov
Member

Откуда:
Сообщений: 930
Glory
rsolanov
daw

> Но тогда план будет каждый раз перестраиваться и большой скорости от
> этого не получить.

брррр. вы круглое с кислым сравниваете. у inline-функции своего плана
вообще нет. у каждого нового (отличного от ранее выполненных) запроса
с использованием inline-функции разумеется будет новый свой собственный
план. который ничто не мешает использовать повторно, если надо.

Я имел в виду план общего, получившегося запроса. Просто я как понимаю что на создание нового плана исполнения затрачиваются определенные серверные ресурсы, поэтому в некоторых случаях мы можем получить увеличение времени выполнения запроса сервером.

План создается вообще то для любого запроса. Причем тут функции ?

Конечно план строится для каждого запроса, другое дело в одних случаях он может строиться однократно, а в других многократно: при каждом обращении к запросу. Соответственно причем тут функции - это понять в каких случаях с каким типом функции план будет строиться один раз, а в каком каждый раз при обращении к запросу. Таким образом мы выяснили, что при использовании inline-функции план выполнения для получившегося запроса будет строиться каждый раз при обращении запросу, а при использовании многооператорных функций (как Вы сказали, представляющих черный ящик) план основного запроса не перестраивается, за счет чего в отдельных случаях мы можем получить более быстрое время выполнения запроса, хотя и не всегда так. Выбор надо делать в зависимости от ситуации, анализируя основной запрос и запрос в функции.
15 сен 09, 15:58    [7662357]     Ответить | Цитировать Сообщить модератору
 Re: Многооператорная функция и встроенная функция, возвращающие табличные значения  [new]
Glory
Member

Откуда:
Сообщений: 104760
rsolanov
Таким образом мы выяснили, что при использовании inline-функции план выполнения для получившегося запроса будет строиться каждый раз при обращении запросу,

Извините, а откуда мы это выяснили ?
15 сен 09, 15:59    [7662384]     Ответить | Цитировать Сообщить модератору
 Re: Многооператорная функция и встроенная функция, возвращающие табличные значения  [new]
iljy
Member

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

вы ответы читаете или сами с собой общаетесь? вам несколько раз уже сказали - план запроса используется повторно! т.е. строится один раз и запоминается в кеше.
15 сен 09, 16:02    [7662415]     Ответить | Цитировать Сообщить модератору
 Re: Многооператорная функция и встроенная функция, возвращающие табличные значения  [new]
rsolanov
Member

Откуда:
Сообщений: 930
Все понял, извините.
Огромное всем СПАСИБО за науку, теперь наконец-то все стало понятно.
15 сен 09, 17:08    [7663048]     Ответить | Цитировать Сообщить модератору
 создать простенькую функцию  [new]
sasha0909
Member

Откуда:
Сообщений: 1
привет, всем, а как создать функцию, которая выводит дату сегодняшнюю
1 окт 09, 08:47    [7727927]     Ответить | Цитировать Сообщить модератору
 Re: создать простенькую функцию  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
sasha0909
привет, всем, а как создать функцию, которая выводит дату сегодняшнюю
А чо её создавать? Она встроена - getdate().

Сообщение было отредактировано: 1 окт 09, 09:13
1 окт 09, 09:13    [7727972]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить