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

Откуда: Киев
Сообщений: 2611
Добрый день.

Интресует проиводительности запросов, всегда думал что для такого примера нет разницы.в скалярке нет никакой выборки , но мне намекают что влияет на производительность



1 вариант
select id,  ISNULL(NAME, '') + ' ' + ISNULL(surNAME, '')  from table  


2. Select id, dbo.GetFullName(NAME,surNAME)   from table 


ну а функция всередине реализует все тоже
ISNULL(NAME, '') + ' ' + ISNULL(surNAME, '')


Спасибо.
7 апр 16, 17:37    [19029198]     Ответить | Цитировать Сообщить модератору
 Re: Cкалярная функция или вручную соединить строки  [new]
Crimean
Member

Откуда:
Сообщений: 13147
3. вычисляемое поле
7 апр 16, 18:01    [19029316]     Ответить | Цитировать Сообщить модератору
 Re: Cкалярная функция или вручную соединить строки  [new]
iljy
Member

Откуда:
Сообщений: 8711
Andrey1306
Добрый день.

Интресует проиводительности запросов, всегда думал что для такого примера нет разницы.в скалярке нет никакой выборки , но мне намекают что влияет на производительность


Скалярные функции в TSQL реализованы не особо эффективно. Если критично, то используйте INLINE TABLE VALUE и вызывайте через OUTER APPLY, тогда накладных расходов не будет. Ну или вычисляемое поле, да.
7 апр 16, 18:46    [19029515]     Ответить | Цитировать Сообщить модератору
 Re: Cкалярная функция или вручную соединить строки  [new]
Glory
Member

Откуда:
Сообщений: 104751
Andrey1306
Интресует проиводительности запросов, всегда думал что для такого примера нет разницы.в скалярке нет никакой выборки , но мне намекают что влияет на производительность

При вызове udf всегда будут накладные расходы.
Просто на единичном вызове вы их не заметите.
7 апр 16, 20:32    [19029837]     Ответить | Цитировать Сообщить модератору
 Re: Cкалярная функция или вручную соединить строки  [new]
Andrey1306
Member

Откуда: Киев
Сообщений: 2611
Glory
Andrey1306
Интресует проиводительности запросов, всегда думал что для такого примера нет разницы.в скалярке нет никакой выборки , но мне намекают что влияет на производительность

При вызове udf всегда будут накладные расходы.
Просто на единичном вызове вы их не заметите.


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


Спасибо за ответы.
8 апр 16, 09:06    [19030921]     Ответить | Цитировать Сообщить модератору
 Re: Cкалярная функция или вручную соединить строки  [new]
Glory
Member

Откуда:
Сообщений: 104751
Andrey1306
пагинация, фильтрация вывод табличных значений. (как бы не единичный) приложение использует entityframework (там те еще запросы),

А причем тут udf
Вы считаете, что при Select dbo.GetFullName('d','b') вызов udf не стоит никаких дополнительных ресурсов, по сранению с ISNULL(NAME, '') + ' ' + ISNULL(surNAME, '') ?
Стоит.
8 апр 16, 09:11    [19030941]     Ответить | Цитировать Сообщить модератору
 Re: Cкалярная функция или вручную соединить строки  [new]
постоянный мембер
Guest
Glory
Andrey1306
пагинация, фильтрация вывод табличных значений. (как бы не единичный) приложение использует entityframework (там те еще запросы),

А причем тут udf
Вы считаете, что при Select dbo.GetFullName('d','b') вызов udf не стоит никаких дополнительных ресурсов, по сранению с ISNULL(NAME, '') + ' ' + ISNULL(surNAME, '') ?
Стоит.
Разве эти доп.ресурсы не скомпенсированы мгновенно готовым скомпилированным кодом udf ?
Думаю, что разница обоих подходов будет крайне малозаметной по скорости.
Но ф-цию в отличие от просто текста очень удобно многократно использовать.
И возможные правки в ф-ции вступят в силу везде.

Однажды я менял полсотни подобных текстов (формирование сложного артикула) на вызов функции. Одно удовольствие, блин.... :)

Функции рулят.
8 апр 16, 11:37    [19031679]     Ответить | Цитировать Сообщить модератору
 Re: Cкалярная функция или вручную соединить строки  [new]
iljy
Member

Откуда:
Сообщений: 8711
постоянный мембер,

нет, не скомпенсированы. Возьмите да проверьте: запустите вычисление скалярной UDF по десятимиллионной таблице, а потом перепишите ее как инлайн табличную и еще раз запустите.
8 апр 16, 11:47    [19031765]     Ответить | Цитировать Сообщить модератору
 Re: Cкалярная функция или вручную соединить строки  [new]
Glory
Member

Откуда:
Сообщений: 104751
постоянный мембер
мгновенно готовым скомпилированным кодом udf

Еще раз
Вы сраниваете прямой вызов встроенной функции ISNULL и ее же вызов через обертку udf.
Не надо думать, что обертка ничего не стоит. И никак не влияет на тот же план выполнения.

постоянный мембер
Но ф-цию в отличие от просто текста очень удобно многократно использовать.

Прежде всего нужно знать, где надо использовать функции, а где не надо.

постоянный мембер
И возможные правки в ф-ции вступят в силу везде.

Если вы считаете это достоинством, то спросите тестеров, сколько работы они огребут, когда вы поменяете свою функцию.
И девелоперов, которые уже настрогали своего кода, с использованием вашей функции.
8 апр 16, 11:50    [19031791]     Ответить | Цитировать Сообщить модератору
 Re: Cкалярная функция или вручную соединить строки  [new]
правильный проходящий.
Guest
постоянный мембер
Glory
пропущено...

А причем тут udf
Вы считаете, что при Select dbo.GetFullName('d','b') вызов udf не стоит никаких дополнительных ресурсов, по сранению с ISNULL(NAME, '') + ' ' + ISNULL(surNAME, '') ?
Стоит.
Разве эти доп.ресурсы не скомпенсированы мгновенно готовым скомпилированным кодом udf ?
Нет. В интерпретируемых языках нет такого скомпилированного кода.
Думаю, что разница обоих подходов будет крайне малозаметной по скорости.
И для таких дум есть основания? Желательно не из опыта программирования на императивных языках. Надеюсь, вы помните, что SQL - язык декларативный и знаете разницу между декларативными и императивными языками?
Но ф-цию в отличие от просто текста очень удобно многократно использовать.
Но они при этом сильно тормозят работу. Ибо оптимизатор не может с ними работать и к черту летят всякие индексы, хинты и прочие очеь сильно ускоряющие работу вещи.
И возможные правки в ф-ции вступят в силу везде.

Однажды я менял полсотни подобных текстов (формирование сложного артикула) на вызов функции. Одно удовольствие, блин.... :)

Функции рулят.
То есть ваше личное удобство важней скорости работы программы и толпы пользователей? Очередной "открыватель глаз" неразумных декларативщиков? Ну и тупые же они, элементарных вещей не знают, да? Вам не кажется, что вы пришли в чужой монастырь со своим уставом?
8 апр 16, 11:50    [19031793]     Ответить | Цитировать Сообщить модератору
 Re: Cкалярная функция или вручную соединить строки  [new]
iljy
Member

Откуда:
Сообщений: 8711
Запрос раз
create function dbo.test(@x int) returns table as
	return (select @x + 5 x)
go
declare @x int

;with cte as (
	select ROW_NUMBER() over(order by (select 1)) N
	from master..spt_values v1, master..spt_values v2
)
select @x = x
from cte outer apply dbo.test(N)
go

drop function dbo.test


Запрос два
create function dbo.test(@x int) returns int as
begin 
	return (@x + 5)
end
go
declare @x int

;with cte as (
	select ROW_NUMBER() over(order by (select 1)) N
	from master..spt_values v1, master..spt_values v2
)
select @x = dbo.test(N)
from cte
go

drop function dbo.test
8 апр 16, 11:55    [19031828]     Ответить | Цитировать Сообщить модератору
 Re: Cкалярная функция или вручную соединить строки  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6201
постоянный мембер
Разве эти доп.ресурсы не скомпенсированы мгновенно готовым скомпилированным кодом udf ?

Glory выше писал про скалярные udf. В их случае - не будут. Сделайте выборку объемом побольше с вызовом скалярной udf, запустите профайлер, в событиях выставьте отслеживание SP:StmtStarting и/или SP:StmtCompleted, и полюбуйтесь на картину. Можете считать, что каждая строчка лога профайлера на вышеупомянутые события и есть те самые накладные расходы.
постоянный мембер
Думаю, что разница обоих подходов будет крайне малозаметной по скорости.

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

А я однажды в одном запросе заменил скалярные функции на инлайновые, и время выполнения запроса с 10 минут упало до 20 секунд.
8 апр 16, 11:57    [19031841]     Ответить | Цитировать Сообщить модератору
 Re: Cкалярная функция или вручную соединить строки  [new]
iljy
Member

Откуда:
Сообщений: 8711
постоянный мембер,

в конце концов сами подумайте: компиляция запроса один раз происходит, а вызов функции - для каждой строки, где расходы будут больше?
8 апр 16, 11:57    [19031845]     Ответить | Цитировать Сообщить модератору
 Re: Cкалярная функция или вручную соединить строки  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
iljy
Запрос раз
create function dbo.test(@x int) returns table as
	return (select @x + 5 x)
go
declare @x int

;with cte as (
	select ROW_NUMBER() over(order by (select 1)) N
	from master..spt_values v1, master..spt_values v2
)
select @x = x
from cte outer apply dbo.test(N)
go

drop function dbo.test
Зачем outer apply? Это даст NL + Constant Scan.
А cross apply преобразуется просто в Compute Scalar.
8 апр 16, 12:18    [19031996]     Ответить | Цитировать Сообщить модератору
 Re: Cкалярная функция или вручную соединить строки  [new]
iljy
Member

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

ну да, логично, хотя и не принципиально
8 апр 16, 12:45    [19032209]     Ответить | Цитировать Сообщить модератору
 Re: Cкалярная функция или вручную соединить строки  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
iljy
хотя и не принципиально
С точки зрения результата - да.
С точки зрения минимизации накладных расходов - cross apply таки выгоднее.
8 апр 16, 12:55    [19032265]     Ответить | Цитировать Сообщить модератору
 Re: Cкалярная функция или вручную соединить строки  [new]
iljy
Member

Откуда:
Сообщений: 8711
invm
iljy
хотя и не принципиально
С точки зрения результата - да.
С точки зрения минимизации накладных расходов - cross apply таки выгоднее.

Я не спорю, что выгоднее. Но выгода не принципиальна. Уж по сравнению с вызовами скалярных UDF так точно.
8 апр 16, 12:56    [19032272]     Ответить | Цитировать Сообщить модератору
 Re: Cкалярная функция или вручную соединить строки  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
iljy
Уж по сравнению с вызовами скалярных UDF так точно.
Да, с эти не поспоришь.
8 апр 16, 13:14    [19032392]     Ответить | Цитировать Сообщить модератору
 Re: Cкалярная функция или вручную соединить строки  [new]
Crimean
Member

Откуда:
Сообщений: 13147
вы еще попробуйте попрофайлить запросы с UDF с большим execution count. то еще удовольствие фильты писать.
8 апр 16, 16:02    [19033884]     Ответить | Цитировать Сообщить модератору
 Re: Cкалярная функция или вручную соединить строки  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
постоянный мембер
Разве эти доп.ресурсы не скомпенсированы мгновенно готовым скомпилированным кодом udf ?
Думаю, что разница обоих подходов будет крайне малозаметной по скорости.
Увы, разница раз в тыщу будет в данном случае.
Вот инлайн функция да, компилируется.
Т.е. (Select поле From dbo.GetFullName('d','b')) будет работать почти так же быстро, как ISNULL(NAME, '') + ' ' + ISNULL(surNAME, '')
8 апр 16, 17:51    [19034508]     Ответить | Цитировать Сообщить модератору
 Re: Cкалярная функция или вручную соединить строки  [new]
Andrey1306
Member

Откуда: Киев
Сообщений: 2611
Glory
Andrey1306
пагинация, фильтрация вывод табличных значений. (как бы не единичный) приложение использует entityframework (там те еще запросы),

А причем тут udf
Вы считаете, что при Select dbo.GetFullName('d','b') вызов udf не стоит никаких дополнительных ресурсов, по сранению с ISNULL(NAME, '') + ' ' + ISNULL(surNAME, '') ?
Стоит.



udf тут при том что он используется в селекте. выделеное следует понимать как вывод даных с таблиц (( .

10 млн значений сразу никто не вывод. максимум 100 помоему.
11 апр 16, 09:38    [19040856]     Ответить | Цитировать Сообщить модератору
 Re: Cкалярная функция или вручную соединить строки  [new]
Glory
Member

Откуда:
Сообщений: 104751
Andrey1306
udf тут при том что он используется в селекте. выделеное следует понимать как вывод даных с таблиц (( .

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

Andrey1306
10 млн значений сразу никто не вывод. максимум 100 помоему.

А вы считаете, что выполнение запроса начинается сразу с вывода результатов ?
Без всяких манипуляций с 10млн записей ?
11 апр 16, 09:46    [19040881]     Ответить | Цитировать Сообщить модератору
 Re: Cкалярная функция или вручную соединить строки  [new]
Andrey1306
Member

Откуда: Киев
Сообщений: 2611
Glory


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


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

Glory

...
При вызове udf всегда будут накладные расходы.
Просто на единичном вызове вы их не заметите.




Glory
А вы считаете, что выполнение запроса начинается сразу с вывода результатов ?
Без всяких манипуляций с 10млн записей ?


нет не считаю (сортировка, фильтрация, роунамбер ... )


Я понял udf зло.

Спасибо.
11 апр 16, 10:34    [19041037]     Ответить | Цитировать Сообщить модератору
 Re: Cкалярная функция или вручную соединить строки  [new]
iljy
Member

Откуда:
Сообщений: 8711
Andrey1306
Я понял udf зло.

Спасибо.


Да чтож за подростковый максимализм-то?? Зло - это когда болты кувалдой забивают, а udf - обычный инструмент со своей областью применения.
11 апр 16, 10:41    [19041077]     Ответить | Цитировать Сообщить модератору
 Re: Cкалярная функция или вручную соединить строки  [new]
Andrey1306
Member

Откуда: Киев
Сообщений: 2611
iljy,

шучу я !!

PS

Лучше шуруп забитый молотком, чем гвоздь закрученный отверткой
11 апр 16, 10:52    [19041136]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить