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

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

Имеется проблема: написана многооператорная пользовательская функция на основе селекта. Сам селект работает 30-40 секунд, а выполнение функции с этим запросом "весит" неприлично долго - самый долгий период на который хватило терпения - 1 час.

В чем может быть проблема?

MS Sql server 2005
21 ноя 14, 11:21    [16883760]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение функции  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
в плане исполнения запроса вот етого счастья -
katysha
написана многооператорная пользовательская функция на основе селекта.

там небось у вас условие where из 10 isnull +or состоит.
21 ноя 14, 11:23    [16883775]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение функции  [new]
katysha
Member

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

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

Или я то-то не так написала???
21 ноя 14, 11:28    [16883813]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение функции  [new]
Glory
Member

Откуда:
Сообщений: 104760
katysha
написана многооператорная пользовательская функция на основе селекта. Сам селект работает 30-40 секунд, а выполнение функции с этим запросом "весит" неприлично долго - самый долгий период на который хватило терпения - 1 час

Т.е. вы взяли некий select, трансформировали его во "много операторов", поместили их в функцию и ожидаете от функции производительности оргинального select-а ?
21 ноя 14, 11:32    [16883841]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение функции  [new]
aleks2
Guest
Glory
katysha
написана многооператорная пользовательская функция на основе селекта. Сам селект работает 30-40 секунд, а выполнение функции с этим запросом "весит" неприлично долго - самый долгий период на который хватило терпения - 1 час

Т.е. вы взяли некий select, трансформировали его во "много операторов", поместили их в функцию и ожидаете от функции производительности оргинального select-а ?


Можно ожидать даже большей.
Если правильно трансформировать.



Тредстартеру.
Ну сделай ты на возвращаемой таблице индекс(ы).
И будет тибе щастье.
21 ноя 14, 11:43    [16883973]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение функции  [new]
katysha
Member

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

пишу то что делала - мне нужна была ф-ция которая вернет данные в виде таблицы, посему создавала то что в ms studio называется "многооператорная ф-ция возвращающая табличное значение".

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

по моим представления: выполнение просто селекта и выполнения этого же селекта внутри ф-ции должны быть по времени равными. Разве нет?
21 ноя 14, 11:49    [16884030]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение функции  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
katysha
Или я то-то не так написала???

я вообще в Вангу играю по факту - потому как вы о совей ф-ции рассказали практически ничего.
Не текста ф-ции не плана
21 ноя 14, 11:50    [16884043]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение функции  [new]
Glory
Member

Откуда:
Сообщений: 104760
katysha
по моим представления: выполнение просто селекта и выполнения этого же селекта внутри ф-ции должны быть по времени равными. Разве нет?

А вы без функции тестировали ваш "алгоритм" ?
21 ноя 14, 11:51    [16884056]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение функции  [new]
katysha
Member

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

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



Maxx,

а что именно нужно написать? мой огромный селект который сращивает журнал операций и документы + еще пара справочников?
21 ноя 14, 11:55    [16884107]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение функции  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
katysha
а что именно нужно написать? мой огромный селект который сращивает журнал операций и документы + еще пара справочников?

хотя бы план покажите медленного выполнения ф-ции
Время исполнения - 1 час... недостаточные симптомы чтоб ставить диагноз
21 ноя 14, 11:58    [16884139]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение функции  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Да и сам селект если не жалко....
Просто сейчас ет о называеться - гадание на кофейной гуще
21 ноя 14, 11:59    [16884162]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение функции  [new]
aleks2
Guest
katysha
а что именно нужно написать? мой огромный селект который сращивает журнал операций и документы + еще пара справочников?

Вот, блин, святая простота.

1. А тормозит то твою функцию Обама, чтоле?
2. Запустил ли ты "содержимое функции" без функции?
21 ноя 14, 12:00    [16884166]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение функции  [new]
iap
Member

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

а почему нельзя сделать табличную инлайн функцию?
21 ноя 14, 12:01    [16884180]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение функции  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
iap
katysha,

а почему нельзя сделать табличную инлайн функцию?

патаму ша
katysha
пишу то что делала - мне нужна была ф-ция которая вернет данные в виде таблицы, посему создавала то что в ms studio называется "многооператорная ф-ция возвращающая табличное значение".


было лень читать хелп кому-то
21 ноя 14, 12:04    [16884222]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение функции  [new]
leov
Member

Откуда: С-Петербург
Сообщений: 616
katysha,

если запустить подробный трейс то можно увидеть какие именно операции тормозят при исполнении функции
21 ноя 14, 12:07    [16884265]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение функции  [new]
katysha
Member

Откуда:
Сообщений: 53
вот такой вариан остался и он продолжает виснуть. изначально

ALTER FUNCTION [dbo].[uf_dds]
(
@dates datetime,
@datee datetime
)
RETURNS 
@DDS TABLE 
(
	date datetime,
	dayweek varchar(3),
	nfirm varchar (50),
	typepay varchar (150),
	sumpay decimal(18,2),
	fgroup int
)
AS
BEGIN
	
	declare @temp table (date datetime,
						dayweek int,
						nfirm varchar (50),
						sumrestmon decimal(18,2), 
						sumcustrs decimal(18,2),  
						sumcome decimal(18,2), 
						sumsup decimal(18,2),   
						sumrash decimal(18,2)	, 
						sumtrancome	decimal(18,2),  
						sumtranpay	decimal(18,2), 
						sumval decimal(18,2)							
						)

		set @dates = '2014.09.25'
		set @datee = '2014.11.17'

		insert into @temp
		select	t.thedate as daterest,
				datepart(dw, t.thedate) as dayweek ,
				n_kontr as nfirm,
				restmon as sumrestmon,
				sumcustrs,
				sumcome,
				sumsup,
				sumrash,
				sumtrancome,
				sumtranpay,
				sumval
				
				from 
							(select thedate,
							   id_kontr,
							 sum(sumrest) + sum(sumcust)+ sum(sumcome) -sum(sumsup) - sum(sumpay) as restmon
							from ( 
									select 
									thedate, 
									oborot_days.id_kontr,
									summa as sumrest,
									0 as sumcust,
									0 as sumcome,
									0 as sumsup,
									0 as sumpay
									from calendar (nolock)
									inner join oborot_days (nolock)
									on thedate between @dates and @datee
									and oborot_days.date_rest = dateadd(dd, -1, thedate)
									and schet = 51
									and oborot_days.id_kontr in ( 550861 )
										
									inner join kontr_bank (nolock)
									on kontr_bank.id_kontr = oborot_days.id_kontr
									and use_def = 1

								

										union all
									
									select 
									thedate, id_firm,
									0,
									sum(oper.sum_db ),
									0,
									0,
									0
									from calendar (nolock)

									inner join fin_doc (nolock)
									on thedate between @dates and @datee
									and id_status_doc between 20 and 50
									and fin_doc.in_tax in (0, 11)
									and id_firm in ( 550861)
									and fin_doc.sum_db > 0
									and fin_doc.date_doc  < thedate

									inner join spr_type_doc (nolock)
									on fin_doc.id_type_doc = spr_type_doc.id_type_doc
									and spr_type_doc.id_type_doc <> 37
									and spr_type_doc.id_type_doc <> 34
									and db = '51' 

									inner join oper (nolock)
									on oper.id_doc = fin_doc.id_doc
									and oper.date_posting >= thedate
									
									
								
									group by thedate , id_firm

                                                                       union all

									select 
									thedate, id_firm,
									0,
									0,
									sum(oper.sum_db),
									0,
									0
									from calendar (nolock)
									inner join  fin_doc (nolock)
									on thedate between @dates and @datee
									and id_status_doc between 20 and 50
									and in_tax in (0, 11)
									and id_firm in ( 550861)
									and fin_doc.sum_db < 0
									
									inner join spr_type_doc (nolock)
									on fin_doc.id_type_doc = spr_type_doc.id_type_doc
									and spr_type_doc.id_type_doc <> 37
									and spr_type_doc.id_type_doc <> 34
									and db = '51' 

									inner join oper (nolock)
									on oper.id_doc = fin_doc.id_doc
									and oper.date_posting>= thedate
									and fin_doc.date_doc  < thedate
									
						
									group by thedate , id_firm

									union all

									select 
									thedate, fin_doc.id_kontr_db,
									0,
									0,
									sum(oper.sum_db),
									0,
									0
									from calendar (nolock)
									inner join  fin_doc (nolock)
									on thedate between @dates and @datee
									and id_status_doc between 20 and 50
									and in_tax in (0, 11)
									and fin_doc.id_kontr_db in ( 550861)
									
									inner join spr_type_doc (nolock)
									on fin_doc.id_type_doc = spr_type_doc.id_type_doc
									and spr_type_doc.id_type_doc  = 37

									inner join oper (nolock)
									on oper.id_doc = fin_doc.id_doc
									and oper.date_posting>= thedate
									and fin_doc.date_doc  < thedate
									
						
									group by thedate , fin_doc.id_kontr_db


) as trest
							group by  thedate,
								   id_kontr
							


							) as t

				
				inner join spr_kontr
				on spr_kontr.id_kontr = t.id_kontr

									
									
RETURN 
END
21 ноя 14, 12:08    [16884276]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение функции  [new]
Glory
Member

Откуда:
Сообщений: 104760
katysha
вот такой вариан остался и он продолжает виснуть. изначально

Вы это называете " выполнение просто селекта и выполнения этого же селекта внутри ф-ции " ?
Вы этот вот весь код без функции выполняли ?
21 ноя 14, 12:12    [16884325]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение функции  [new]
aleks2
Guest
Ну что... обычный говнокод.
union all + group by...

Нахера вам объединение таблиц? Низзя посчитать три раза?

И после этого нам рассказывают, что запрос выполняется "быстро".
21 ноя 14, 12:14    [16884343]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение функции  [new]
Maxx
Member [скрыт]

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

А что вы ожидатате от етой ф-ции ???? Вы вообще резудьтат своих селектов куда засунули - то ???
21 ноя 14, 12:14    [16884354]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение функции  [new]
katysha
Member

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

естественно.
вопрос и возник из-за того что просто выполнение этого селекта работает в течениии 30 секунд, а выполнение его внутри ф-ции очень долго
21 ноя 14, 12:15    [16884370]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение функции  [new]
iap
Member

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

функция возвращает @DDS, а Вы создаёте и заполняете какую-то @temp?
Оригинально, однако.
21 ноя 14, 12:16    [16884373]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение функции  [new]
katysha
Member

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

хвост не приписывала там вот такого вида действия

	insert into @dds
		select date,
				case dayweek
					when 1 then 'вс'
					when 2 then 'пн'
					when 3 then 'вт'
					when 4 then 'ср'
					when 5 then 'чт'
					when 6 then 'пт'
					when 7 then 'сб'
				end,
				nfirm,
				'оплата от покупателя (р/с)',
				sumcustrs,
				1
		 from @temp
21 ноя 14, 12:17    [16884392]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение функции  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
iap
katysha,

функция возвращает @DDS, а Вы создаёте и заполняете какую-то @temp?
Оригинально, однако.
И, кстати, всё великолепие представленной функции заключено в одну инструкцию SELECT.
Повторяю вопрос: почему не inline table function??
21 ноя 14, 12:18    [16884397]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение функции  [new]
leov
Member

Откуда: С-Петербург
Сообщений: 616
katysha
вопрос и возник из-за того что просто выполнение этого селекта работает в течениии 30 секунд, а выполнение его внутри ф-ции очень долго
выполнение именно селекта или выполнение всего кода т.е инсерта+селекта?
21 ноя 14, 12:20    [16884416]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение функции  [new]
aleks2
Guest
katysha
Glory,

естественно.
вопрос и возник из-за того что просто выполнение этого селекта работает в течениии 30 секунд, а выполнение его внутри ф-ции очень долго


Даже если допустить, что не врешь, то 30 сек - все одно, долго.

Но, вангую, врешь.
insert то нибось тоже не выполнешь?

ЗЫ. Разница, теоретически, может возникать из-за разных SET ... Тех, что сохраняются вместе с функцией.
21 ноя 14, 12:21    [16884425]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить