Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: Функция создается каждый раз при обращении  [new]
bravo1
Member

Откуда:
Сообщений: 16
zasandator
bravo1,

оптемезируй фунгцыю чо...

...

Твоя фунгцыя 564 выдала на моем локальном компе, новая... 116 миллисекунд...


О, большое спасибо, у меня не такая разительная разница получилась, но Ваша в два раза стабильно быстрее.
3 июн 15, 12:15    [17724590]     Ответить | Цитировать Сообщить модератору
 Re: Функция создается каждый раз при обращении  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31438
zasandator
Твоя фунгцыя 564 выдала на моем локальном компе, новая... 116 миллисекунд...
Неправильно меряете скорость. У вас время основное уходит на обмен данными по сети с клиентом. На каждый из 10000 вызовов - один сеанс обмена, выполнение миллионов команд.

Вот правильный замер:
declare
    @d datetime = getdate(),
	@v VARCHAR(256)

select @v = dbo.udf_GetNumeric('125503')
from sys.syscolumns c1, sys.syscolumns c2

select datediff(millisecond, @d, getdate()) as orig_func_time

select
    @d = getdate()

select @v = dbo.udf_GetNumeric2('125503')
from sys.syscolumns c1, sys.syscolumns c2

select datediff(millisecond, @d, getdate()) as new_func_time

select
    @d = getdate()

select @v = reverse(left(reverse('125503'),patindex('%[^0-9]%',reverse('x'+'125503'))-1))
from sys.syscolumns c1, sys.syscolumns c2

select datediff(millisecond, @d, getdate()) as direct_time

select
    @d = getdate()

select @v = '125503'
from sys.syscolumns c1, sys.syscolumns c2

select datediff(millisecond, @d, getdate()) as constant_time

go

Результат:
orig_func_time
32116

new_func_time
24440

direct_time
470

constant_time
250

Анализируем, делаем выводы.

Время на вычисления небольшие по сравнению с выборкой данных (470 vs 250)
Время на вызов функции невероятно высоки (24440 vs 470).

Даже если в функция просто возвращает константу, она будет выполняться невероятно долго, увеличивая время выполнения запроса в сотни, тысячи раз.
a_voronin
В моём случае замена функции на константу никак на скорость не повлияло
Да да, вы же не читатель, вы писатель - константу, поди, в тело функции вставили? :-)
3 июн 15, 12:51    [17724816]     Ответить | Цитировать Сообщить модератору
 Re: Функция создается каждый раз при обращении  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
bravo1
zasandator
bravo1,

оптемезируй фунгцыю чо...

...

Твоя фунгцыя 564 выдала на моем локальном компе, новая... 116 миллисекунд...


О, большое спасибо, у меня не такая разительная разница получилась, но Ваша в два раза стабильно быстрее.


у него новый копьютер, быстрый ;-)
3 июн 15, 13:00    [17724867]     Ответить | Цитировать Сообщить модератору
 Re: Функция создается каждый раз при обращении  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31438
alexeyvg
Результат:
orig_func_time
32116

new_func_time
24440

direct_time
470

constant_time
250

Вот, что бы привести результаты к общему виду, выполнил на 10000 строках:

orig_func_time
223

new_func_time
123

direct_time
0

constant_time
3

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

Сравните с вашими "Твоя фунгцыя 564 выдала на моем локальном компе, новая... 116 миллисекунд..."

0-3 вместо 116, то есть, как и в моём замере, использование функции замедляет запрос примерно в 100 раз.
3 июн 15, 13:01    [17724883]     Ответить | Цитировать Сообщить модератору
 Re: Функция создается каждый раз при обращении  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
alexeyvg,

Есть же set statistics time on
3 июн 15, 13:06    [17724917]     Ответить | Цитировать Сообщить модератору
 Re: Функция создается каждый раз при обращении  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
invm
a_voronin
В моём случае замена функции на константу никак на скорость не повлияло. Время исполнения осталось таким же. А это было на десятках лямов строк.
Если функция была скалярная и не schemabinding, то вы либо в очередной раз выдаете желаемое за действительное, либо ваш запрос настолько "тормозной", что накладные расходы на вызов функции не оказывают заметного влияния на время выполнения.


Функция о которой шла речь, делало подзапрос к таблице из нескольких сотен строк. Её параметр был константой. Но значение было одно на весь запрос.
3 июн 15, 13:19    [17725011]     Ответить | Цитировать Сообщить модератору
 Re: Функция создается каждый раз при обращении  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
a_voronin
Функция о которой шла речь, делало подзапрос к таблице из нескольких сотен строк. Её параметр был константой. Но значение было одно на весь запрос.
Такая скалярная функция, даже будучи детерминированной и с константным параметром, будет вызвана построчно, а не один раз за запрос.
Так что вы опять фигню пишите.
3 июн 15, 13:37    [17725148]     Ответить | Цитировать Сообщить модератору
 Re: Функция создается каждый раз при обращении  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
invm
a_voronin
Функция о которой шла речь, делало подзапрос к таблице из нескольких сотен строк. Её параметр был константой. Но значение было одно на весь запрос.
Такая скалярная функция, даже будучи детерминированной и с константным параметром, будет вызвана построчно, а не один раз за запрос.
Так что вы опять фигню пишите.


Фигню говорите вы. Я ничего не говорил про то как она вызывается. Я сказал, что при замене её на константу скорость не изменилась.
3 июн 15, 13:56    [17725323]     Ответить | Цитировать Сообщить модератору
 Re: Функция создается каждый раз при обращении  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
a_voronin
Я ничего не говорил про то как она вызывается. Я сказал, что при замене её на константу скорость не изменилась.
А тут речь ведется про то, как функция вызывается. Ну конечно, если функцию вызывать вне запроса, то на скорость выполнения запроса она не влияет.
Почему-то, практически все рассказы о ваших бесподобных улучшениях-оптимизациях очень сильно напоминают байки рыболовов-охотников о размере и весе улова-добычи.
3 июн 15, 14:28    [17725521]     Ответить | Цитировать Сообщить модератору
 Re: Функция создается каждый раз при обращении  [new]
o-o
Guest
значит, верна гипотеза номер два:
invm
a_voronin
В моём случае замена функции на константу никак на скорость не повлияло. Время исполнения осталось таким же. А это было на десятках лямов строк.
Если функция была скалярная и не schemabinding, то вы либо в очередной раз выдаете желаемое за действительное, либо ваш запрос настолько "тормозной", что накладные расходы на вызов функции не оказывают заметного влияния на время выполнения.

подумаешь, разница в 4 секунды, если все остальное часами выполняется
результаты на картинке,
код вот он, в открытом доступе.
замеряно на 2014-ом сервере,
желающие могут сами проверить.
--create function dbo.udf_kto_na_svete_vsex_umnee_vsex_krasivej_i_belee()
--returns varchar(256)
--as
--begin
--   return 'A_VORONIN';
--end;

set statistics time on;
set statistics io on; 
select *, dbo.udf_kto_na_svete_vsex_umnee_vsex_krasivej_i_belee()
from dbo.nums;


К сообщению приложен файл. Размер - 74Kb
3 июн 15, 14:38    [17725582]     Ответить | Цитировать Сообщить модератору
 Re: Функция создается каждый раз при обращении  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
invm
a_voronin
Я ничего не говорил про то как она вызывается. Я сказал, что при замене её на константу скорость не изменилась.
А тут речь ведется про то, как функция вызывается. Ну конечно, если функцию вызывать вне запроса, то на скорость выполнения запроса она не влияет.
Почему-то, практически все рассказы о ваших бесподобных улучшениях-оптимизациях очень сильно напоминают байки рыболовов-охотников о размере и весе улова-добычи.


А на днях Швецкие ВМФ отловили российскую подлодку аж километр длиной.
3 июн 15, 14:59    [17725775]     Ответить | Цитировать Сообщить модератору
 Re: Функция создается каждый раз при обращении  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
o-o,

Повторите на 100 000 000
3 июн 15, 15:04    [17725824]     Ответить | Цитировать Сообщить модератору
 Re: Функция создается каждый раз при обращении  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
o-o
либо ваш запрос настолько "тормозной", что накладные расходы на вызов функции не оказывают заметного влияния на время выполнения.


Вполне возможно. Речь шла о 180 000 вызовах в секунду тем не менее.
3 июн 15, 15:06    [17725836]     Ответить | Цитировать Сообщить модератору
 Re: Функция создается каждый раз при обращении  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
a_voronin
o-o
либо ваш запрос настолько "тормозной", что накладные расходы на вызов функции не оказывают заметного влияния на время выполнения.


Вполне возможно. Речь шла о 180 000 вызовах в секунду тем не менее.


Кстати тест ваш вовсе не отражает мою ситуацию.

Функция фильтровала кластерный индекс, который имел лишь небольшое количество значений (дат). около 1000-2000. Поэтому может она по факту и выполнялась не более 2000 раз.
3 июн 15, 15:09    [17725849]     Ответить | Цитировать Сообщить модератору
 Re: Функция создается каждый раз при обращении  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31438
o-o
значит, верна гипотеза номер два:
Или гипотеза №3 - был повторен тот самый изначальный тест, а там уходит на каждый print куча времени, и все замеры теряют смысл в принципе.

Что тут вообще обсуждать без репро фантазии a_voronin? Мало ли, что и как он делал, и что мерял?

Я же привёл тест, сравнение всех вариантов, каждый может запустить, и потом уже обсуждать.
3 июн 15, 15:10    [17725866]     Ответить | Цитировать Сообщить модератору
 Re: Функция создается каждый раз при обращении  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31438
o-o
желающие могут сами проверить.
Тут не совсем корректный тест, поскольку клиенту выдаётся рекордсет в миллион строк, и сравнивается время выдачи рекордсета. Чего его сравнивать, что из этого теста можно понять?
3 июн 15, 15:15    [17725883]     Ответить | Цитировать Сообщить модератору
 Re: Функция создается каждый раз при обращении  [new]
o-o
Guest
a_voronin
Кстати тест ваш вовсе не отражает мою ситуацию.

во блин-то,
вы свою ф-цию где считаете,
вызов ее написан вот так:
select col_1,...,col_n, dbo.my_func()
from ...

в запросе, отдающем 180 000 строк (ну или сколько там у вас?)???

если вызов именно такой, то будь в ф-ции просто return const, как у меня,
или что еще другое, она вызовется столько раз, сколько строк возвратит ваш запрос
3 июн 15, 15:15    [17725888]     Ответить | Цитировать Сообщить модератору
 Re: Функция создается каждый раз при обращении  [new]
o-o
Guest
alexeyvg
o-o
желающие могут сами проверить.
Тут не совсем корректный тест, поскольку клиенту выдаётся рекордсет в миллион строк, и сравнивается время выдачи рекордсета. Чего его сравнивать, что из этого теста можно понять?

желающие легким движением руки переделывают select на select into куда угодно.
сравним скорость записи миллионного рекордсета на все тот же диск :)

и вообще, сервер на моем компе, почему и что должно заставить его подыгрывать мне,
а не воронину, вываливая за разное время 1000000 строк в одну и ту же студию без участия сети?
3 июн 15, 15:21    [17725920]     Ответить | Цитировать Сообщить модератору
 Re: Функция создается каждый раз при обращении  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31438
o-o
желающие легким движением руки переделывают select на select into куда угодно.
сравним скорость записи миллионного рекордсета на все тот же диск :)
Ну так в моём варианте сравнивается то, что нас интересует, а не скорость записи на диск, или даже в память.

То есть переделываете select ... не на select ... into куда угодно, а на select @скалярная_переменная = ...
3 июн 15, 15:23    [17725936]     Ответить | Цитировать Сообщить модератору
 Re: Функция создается каждый раз при обращении  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
o-o
a_voronin
Кстати тест ваш вовсе не отражает мою ситуацию.

во блин-то,
вы свою ф-цию где считаете,
вызов ее написан вот так:
select col_1,...,col_n, dbo.my_func()
from ...

в запросе, отдающем 180 000 строк (ну или сколько там у вас?)???

если вызов именно такой, то будь в ф-ции просто return const, как у меня,
или что еще другое, она вызовется столько раз, сколько строк возвратит ваш запрос


Вызов был такой

SELECT *
FROM [Facts].[Vw_Stock_chrt_COUNT] F
WHERE F.pk_date BETWEEN 
	[Facts].[udf_PartitionStartDate]('....', 'CustomerOrders', 201309) AND 
	[Facts].[udf_PartitionEndDate]  ('....', 'CustomerOrders', 201309)




Был заменен на такой

SELECT *
FROM [Facts].[Vw_Stock_chrt_COUNT] F
WHERE F.pk_date BETWEEN 20130901 AND 20130931




ALTER FUNCTION [Facts].[udf_PartitionEndDate](
	@Database_Name [sysname],
	@Cube_Name [sysname],
	@Partition_Value INT
)
RETURNS INT
AS
BEGIN
	-- дата конца партиции
	DECLARE @PartitioningDate DATE = 
	(
		SELECT TOP 1 End_Date FROM [Facts].[SSIS_CubePartition_Dates]
		WHERE [Database_Name] = @Database_Name AND [Cube_Name] = @Cube_Name AND Value = @Partition_Value
	);
	RETURN dbo.Date_To_Num(@PartitioningDate);

END

[Facts].[Vw_Stock_chrt_COUNT] вьюха с джойном, но pk_date кластерный индекс её главной таблицы и имеет он не такое большое число значений.


Один селект может доходить 30 лямов и длиться до 25 минут. Есть клиент SSAS который это ещё переваривает на своей стороне.

Никто не спорит, что тут оверхедов со всех сторон полно. Я просто сказал, что замена функции на константу вообще ничего по скорости не изменила. А вам тут похоже больше посраться интересно, чем понять истину.
3 июн 15, 15:24    [17725938]     Ответить | Цитировать Сообщить модератору
 Re: Функция создается каждый раз при обращении  [new]
o-o
Guest
так еще дольше,
причем пришлось по 3 раза выполнить, чтоб убедиться, что мне не показалось,
а именно так и есть.
ф-ция неизменно проигрывает, с еще бОльшим отрывом

К сообщению приложен файл. Размер - 71Kb
3 июн 15, 15:30    [17725982]     Ответить | Цитировать Сообщить модератору
 Re: Функция создается каждый раз при обращении  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
a_voronin
Я просто сказал, что замена функции на константу вообще ничего по скорости не изменила.
Конечно не изменила. Потому что в вашем запросе каждая функция вызывается по одному разу.
3 июн 15, 15:51    [17726131]     Ответить | Цитировать Сообщить модератору
 Re: Функция создается каждый раз при обращении  [new]
o-o
Guest
alexeyvg
o-o
желающие легким движением руки переделывают select на select into куда угодно.
сравним скорость записи миллионного рекордсета на все тот же диск :)
Ну так в моём варианте сравнивается то, что нас интересует, а не скорость записи на диск, или даже в память.

То есть переделываете select ... не на select ... into куда угодно, а на select @скалярная_переменная = ...

нет, это зачем это я буду 1 раз вызывать ф-цию,
если я пытаюсь показать, как вызов юзерской скалярки будет тормозить как раз за счет
МНОГОКРАТНОГО ее вызова на запрос???
и чем больше строк вернет запрос, тем виднее разница между просто константой и константой в скалярке???
вот вызов getdate() будет одним на весь запрос, а я показываю, что это не наш обсуждаемый случай.
так что я не буду ничего переделывать,
кого не убеждает, или просто нравится вызывать скалярки миллионы раз -- вызывайте
3 июн 15, 16:06    [17726253]     Ответить | Цитировать Сообщить модератору
 Re: Функция создается каждый раз при обращении  [new]
o-o
Guest
to alexeyvg
прошу прощения,
до меня не дошло с первого раза, о чем вы.
т.е. мне показалось, вы предлагаете 1 раз ф-цию вызвать и в переменную сложить
вот правильный тест:

К сообщению приложен файл. Размер - 59Kb
3 июн 15, 16:47    [17726561]     Ответить | Цитировать Сообщить модератору
 Re: Функция создается каждый раз при обращении  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
o-o
to alexeyvg
прошу прощения,
до меня не дошло с первого раза, о чем вы.
т.е. мне показалось, вы предлагаете 1 раз ф-цию вызвать и в переменную сложить
вот правильный тест:


А что насчёт всё-таки более реального случая -- функции в WHERE, например, отфильтровать четные числа?
3 июн 15, 16:52    [17726598]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить