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

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

ALTER Function [GetClientSize](@reportdate date,
@correctname VarChar(255))
returns varchar(255)
as
begin

Declare @clienttype varchar (255)


Set @clienttype = 
(
select 
case 
when t1.summa <=5000000 then 'Small Client'
when t1.summa >5000000 then 'Large Client'
when isnull( t1.summa,0)=0 then 'n/a'
end

from 
(
select correctname, sum(creditamount) as summa
from dbo.CorpPotfolioTotal
where reportdate=@reportdate
and
correctname=@correctname
group by correctname
) as t1

)

return @clienttype


Далее выполняю апдейт, для проставления признака:
update dbo.CorpPotfolioTotal set MassClient_5mln=GetClientSize(reportdate, correctname)
where reportdate in ('2015-05-01') 


В таблице 20 тыс записей, выполняется больше 20 минут...Xeon e5-2690 3Ghz (6processors) ОЗУ 8 гб. Имхо долго. Может как то можно оптимизировать?
22 май 15, 11:19    [17675471]     Ответить | Цитировать Сообщить модератору
 Re: Долго выполняющаяся функция...помощь в оптимизации.  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21241
А почему это нужно делать именно процедурой? Почему не сделать одним запросом?
22 май 15, 11:27    [17675529]     Ответить | Цитировать Сообщить модератору
 Re: Долго выполняющаяся функция...помощь в оптимизации.  [new]
CheaterX
Member

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

Сделано было до меня, я сейчас это сопровождаю. Вот мне тоже кажется что может сразу все в один апдейт засунуть? Есть шанс что будет побыстрее? Может у кого то есть вариант это переписать?
22 май 15, 11:30    [17675549]     Ответить | Цитировать Сообщить модератору
 Re: Долго выполняющаяся функция...помощь в оптимизации.  [new]
Glory
Member

Откуда:
Сообщений: 104751
CheaterX
Может как то можно оптимизировать?

И вы уже посмотрели план запроса в функции ?
Проверили наличие нужных индексов для такого запроса ?

Зачем вот, например, делать group by correctname если есть фильтр correctname=@correctname ?

Сообщение было отредактировано: 22 май 15, 11:41
22 май 15, 11:37    [17675607]     Ответить | Цитировать Сообщить модератору
 Re: Долго выполняющаяся функция...помощь в оптимизации.  [new]
CheaterX
Member

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

видимо решил
select 
case 
when t1.summa <=5000000 then 'Small Client'
when t1.summa >5000000 then 'Large Client'
when isnull( t1.summa,0)=0 then 'n/a'
end,MassClient_5mln

from 
(
select correctname, sum(creditamount) as summa
from dbo.CorpPotfolioTotal
where ReportDate='2015-05-01'
group by correctname
) as t1, CorpPotfolioTotal cpt 

where 
t1.correctname=cpt.correctname
and  ReportDate='2015-05-01'



Я не сильно силен в скуэле.

Как можно посмотреть план запроса и наличие нужных индексов?
22 май 15, 11:40    [17675637]     Ответить | Цитировать Сообщить модератору
 Re: Долго выполняющаяся функция...помощь в оптимизации.  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
CheaterX,

скучно чета седня работается:)
update  t
set MassClient_5mln = clienttype
from 
	dbo.CorpPotfolioTotal t
	join (select  
			reportdate,
			correctname, 
			case 
			when sum(t1.summa) between 0.01 and 5000000 then 'Small Client'
			when sum(t1.summa) > 5000000 then 'Large Client'
			else 'n/a' end as clienttype 
		  from 
			dbo.CorpPotfolioTotal
		  group by 
			reportdate, correctname) s on s.reportdate = t.reportdate and s.correctname = t.correctname
where 
	reportdate in ('2015-05-01') 


хотя без структуру таблиц это пальцем в небо:)
22 май 15, 12:50    [17676210]     Ответить | Цитировать Сообщить модератору
 Re: Долго выполняющаяся функция...помощь в оптимизации.  [new]
aleks2
Guest
WarAnt
update  t
set MassClient_5mln = clienttype
from 
	dbo.CorpPotfolioTotal t
	join (select  
			reportdate,
			correctname, 
			case 
			when sum(t1.summa) between 0.01 and 5000000 then 'Small Client'
			when sum(t1.summa) > 5000000 then 'Large Client'
			else 'n/a' end as clienttype 
		  from 
			dbo.CorpPotfolioTotal
		  group by 
			reportdate, correctname) s on s.reportdate = t.reportdate and s.correctname = t.correctname
where 
	reportdate in ('2015-05-01') 


хотя без структуру таблиц это пальцем в небо:)


Ваще то надо Indexed View.
А это кривой костыль.
22 май 15, 13:48    [17676640]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить