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

Откуда: Россия, Ростовская область, г. Таганрог
Сообщений: 1295
Всем привет!

есть функция, написанная на основе простейших функуций, которые не обращаются к таблицам.

ALTER function [dbo].[fnTimeZoneGMT0ToUsersTZ_number] 
(
	@dateTimeGMT0 datetime,
	@timeZone decimal(4, 2) 
)
RETURNS datetime
AS
BEGIN
	return(dateadd(minute, 60*(@timeZone - cast(@timeZone as int)), dateadd(hour, @timeZone, @dateTimeGMT0)))
END

Если её использовать в запросе, то работает долго (в списке выбираемых полей). Если же её тупо развернуть, то работает быстро

упрощённая форма запроса приблизительно такая


declare @getDate datetime;
set @getDate = GETDATE();
	
	with cteAds as ( 
	 
	 select ab.adID,
	      -- dateadd(hour, -(ab.timeZone), dbo.fnTruncateTime(dbo.fnTimeZoneGMT0ToUsersTZ_number(@getDate, ab.timeZone), null)) startDateTime
	       dateadd(hour, -(ab.timeZone), CAST(DATEDIFF(DAY,0, dateadd(minute, 60*(ab.timeZone - cast(ab.timeZone as int)), dateadd(hour, ab.timeZone, @getDate)) ) AS DATETIME)) as startDateTime
	   from tbAds ab
	  where ab.statusID = 1
	),
	
	cteAdsRevenue as (
	 select a.adID, sum(revenue) as todayRevenue
	   from cteAds a
	  inner
	   join dbo.tbStatsCreativesV2 sc with (nolock)
	     on a.adID = sc.adID
	    and startDateTime <= sc.myHour
	  group by a.adID
	)
	
	select * from cteAdsRevenue

Какой план действий? Из-за чего может быть?
17 июн 09, 19:22    [7312613]     Ответить | Цитировать Сообщить модератору
 Re: Скалрная функция, увеличение быстродействия  [new]
daw
Member

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

можно попробовать переписать на табличную inline функцию
и, соответственно, cross apply к ней в запросе.

Posted via ActualForum NNTP Server 1.4

17 июн 09, 19:34    [7312651]     Ответить | Цитировать Сообщить модератору
 Re: Скалрная функция, увеличение быстродействия  [new]
NIIIK
Member

Откуда: Россия, Ростовская область, г. Таганрог
Сообщений: 1295
daw

можно попробовать переписать на табличную inline функцию
и, соответственно, cross apply к ней в запросе.


попробовал, стало хуже )
Правда я multi statement написал, котому что с inline помню была какая-то проблема с cross apply и передачей параметра.

Но всё равно не вариант менять, потому что функция уже много где юзается...
Я её написал после того как заметил, что подход с тупым сложением dateadd не подходит из-за того что прибавляет только целую часть (ну и параметр у него целый) и из-за таких прицедентов не хочется разворачивать функцию в запросе.
17 июн 09, 20:36    [7312844]     Ответить | Цитировать Сообщить модератору
 Re: Скалрная функция, увеличение быстродействия  [new]
daw
Member

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

> попробовал, стало хуже )
> Правда я multi statement написал

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

> котому что с inline помню была
> какая-то проблема с cross apply и передачей параметра.

что за проблема? ни разу не слышал. не помню, по крайней мере.

> Но всё равно не вариант менять, потому что функция уже много где юзается...
> Я её написал после того как заметил, что подход с тупым сложением
> dateadd не подходит из-за того что прибавляет только целую часть (ну и
> параметр у него целый) и из-за таких прицедентов не хочется
> разворачивать функцию в запросе.

тогда придется смириться с таким быстродействием.
вызовы udf, увы, далеко не бесплатны.
вот, например, можете почитать на тему:
http://dev.net.ua/blogs/def1983/pages/Inline_2D00_UDF_2D00_and_2D00_performance.aspx

Posted via ActualForum NNTP Server 1.4

17 июн 09, 21:06    [7312913]     Ответить | Цитировать Сообщить модератору
 Re: Скалрная функция, увеличение быстродействия  [new]
NIIIK
Member

Откуда: Россия, Ростовская область, г. Таганрог
Сообщений: 1295
CTE заменил на временную таблицу.
17 июн 09, 21:15    [7312933]     Ответить | Цитировать Сообщить модератору
 Re: Скалрная функция, увеличение быстродействия  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Зачем так маятся? У вас же 2005 или выше, судя по стилю...
Напишите CLR скалякную функцию и забейте на быстродействие.
18 июн 09, 06:30    [7313610]     Ответить | Цитировать Сообщить модератору
 Re: Скалрная функция, увеличение быстродействия  [new]
Proga
Member

Откуда: МО
Сообщений: 3042
tpg
Зачем так маятся? У вас же 2005 или выше, судя по стилю...
Напишите CLR скалякную функцию и забейте на быстродействие.

тоже заинтересовало.
Разве это ускорит работу?
18 июн 09, 10:08    [7313941]     Ответить | Цитировать Сообщить модератору
 Re: Скалрная функция, увеличение быстродействия  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Proga
Разве это ускорит работу?
Вот заодно и проверите.
18 июн 09, 10:13    [7313964]     Ответить | Цитировать Сообщить модератору
 Re: Скалрная функция, увеличение быстродействия  [new]
Proga
Member

Откуда: МО
Сообщений: 3042
tpg,
а сказать сразу сложно, да?
18 июн 09, 10:14    [7313971]     Ответить | Цитировать Сообщить модератору
 Re: Скалрная функция, увеличение быстродействия  [new]
Proga
Member

Откуда: МО
Сообщений: 3042
добавлю. Не уделял этой теме особого внимания надобности не было.
А для справки от знающего человека было бы не плохо узнать.
18 июн 09, 10:16    [7313981]     Ответить | Цитировать Сообщить модератору
 Re: Скалрная функция, увеличение быстродействия  [new]
Ыукупф
Member

Откуда:
Сообщений: 36
http://www.sqlmag.com/Article/ArticleID/101104/sql_server_101104.html - вроде как, ему можно верить :)

Сообщение было отредактировано: 18 июн 09, 10:52
18 июн 09, 10:28    [7314040]     Ответить | Цитировать Сообщить модератору
 Re: Скалрная функция, увеличение быстродействия  [new]
Proga
Member

Откуда: МО
Сообщений: 3042
Ыукупф
http://www.sqlmag.com/Article/ArticleID/101104/sql_server_101104.html - вроде как, ему можно верить :)

вообще не в тему. Разговор был про CLR
18 июн 09, 11:00    [7314215]     Ответить | Цитировать Сообщить модератору
 Re: Скалрная функция, увеличение быстродействия  [new]
Ыукупф
Member

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

это Вы писали про CLR, я отвечал на начальный пост
18 июн 09, 11:07    [7314251]     Ответить | Цитировать Сообщить модератору
 Re: Скалрная функция, увеличение быстродействия  [new]
Мимоидущий
Guest

ALTER function [dbo].[fnTimeZoneGMT0ToUsersTZ_number] 
(
	@dateTimeGMT0 datetime,
	@timeZone decimal(4, 2)
)
RETURNS datetime
@timeZone decimal(4, 2)

Тут еще тип decimal сам по себе медленный...
18 июн 09, 11:37    [7314461]     Ответить | Цитировать Сообщить модератору
 Re: Скалрная функция, увеличение быстродействия  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Опять CLR, блин. Да нет проблем с быстродествием, процы итак постоянно простаивают.
Проблема в вызове компилируемых объектов, к которым относятся скалярки, табличные функции (не путать с inline) и процедуры.
А inline это тоже самое, что встроить строку в сам вызов.

Мимоидущий
Тут еще тип decimal сам по себе медленный...
18 июн 09, 12:06    [7314661]     Ответить | Цитировать Сообщить модератору
 Re: Скалрная функция, увеличение быстродействия  [new]
NIIIK
Member

Откуда: Россия, Ростовская область, г. Таганрог
Сообщений: 1295
нет тот случай, где я буду использовать СЛР.
Ладно ещё для агрегатки или для чего-то более функционального....

В Оракле даже идеи не возникало использовать java-функцию в большенстве случаев, тем более в таком простейшем...

Я просто воспользовался функциями для вставки во временную таблицу (вынес из ЦТЕ).


По поводу ....
.NET конечно хорошо, но зачем его применять везде?! Ладно он был бы такой же частю MS SQL Serv. как и T-SQL, но какой бы красивой эта приблуда не была и не помогала бы в сложных ситуациях всё равно это приблуда. И сделана она потому что в МсСКЛ не было заложено изначально нужных концепций. В МсСКЛ от верссии к версии не чувствуется глобальных отличий при разработке, больше маркетинговые ходы. Хотя, безусловно, появление в 2005ом возможности работы с .Net FW это хорошо. Хотя с таким же успехом можно было бы сделать возможность подключения любых ДЛЛ-к, написанных на любом языке. В винде нет проблем с динамическим подключением ДЛЛ-к (всё равно это всё работает только в винде). Любая хрень имеет плагины. Даже я активно участвовал в разработке (ещё на Делфи) приложения, где они постоянно подключались. Популяризация .ФВ хорошо, но лепить его везде я не хочу, хотя активно использую.
В версии Мс СКЛ 2008+ я бы хотел видеть нормальный ООП язык и переделанную структуру функций, процедур и др. объектов. (аналог PL/SQL).

Спасибо за советы! Проблема обойдена ) workaround всегда рядом.
18 июн 09, 13:31    [7315275]     Ответить | Цитировать Сообщить модератору
 Re: Скалрная функция, увеличение быстродействия  [new]
GSerg
Member

Откуда: Магадан
Сообщений: 205
NIIIK
Хотя с таким же успехом можно было бы сделать возможность подключения любых ДЛЛ-к, написанных на любом языке.

Вообще-то именно эту возможность собираются убирать из SQL Server.
Она столько лет там была, что ух. Вы как-то пропустили.
А теперь её меняют на CLR, да.

NIIIK
В версии Мс СКЛ 2008+ я бы хотел видеть нормальный ООП язык и переделанную структуру функций, процедур и др. объектов

А я совсем не хочу ООП-язык для управления множествами :(
Хочу для управления множествами язык, ориентированный на множества.
18 июн 09, 14:38    [7315717]     Ответить | Цитировать Сообщить модератору
 Re: Скалрная функция, увеличение быстродействия  [new]
NIIIK
Member

Откуда: Россия, Ростовская область, г. Таганрог
Сообщений: 1295
GSerg,

Сто процентов пропустил, потому что только слух о ней был, даже не знаю как развернуть в СКЛ Сервере. Вообще не видел ни одного примера.

GSerg
А я совсем не хочу ООП-язык для управления множествами :(
Хочу для управления множествами язык, ориентированный на множества.


Да те части что я хочу вам мешать не будут.... тоже понравились бы.
18 июн 09, 15:28    [7316049]     Ответить | Цитировать Сообщить модератору
 Re: Скалрная функция, увеличение быстродействия  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36824
Хотеть не вредно, в общем-то.
18 июн 09, 15:57    [7316232]     Ответить | Цитировать Сообщить модератору
 Re: Скалрная функция, увеличение быстродействия  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
NIIIK
GSerg,

Сто процентов пропустил, потому что только слух о ней был, даже не знаю как развернуть в СКЛ Сервере. Вообще не видел ни одного примера.
"о ней" - это о ком?
Если Вы всё ещё про DLL, то, видимо, имелись в виду Extended Stored Procedures (ESP).
Microsoft обещает их убить!
18 июн 09, 16:34    [7316521]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить