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

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

[/SRC] create function [dbo].[udf_name]      
(      
 @id1 int,      
 @id2 int,    
 @id3 int,
 @id4 int     
)      
returns varchar(16)      
begin      
 declare @res as int    
 declare @id as int     
 declare @total as varchar(16)      
   
 if exists ( select ... from ... where ...)   
 begin   
 select @res= column from table 
 
 return @res
 end 
  
 if not exists (select ... from ... where ...)     
  begin    
   select @total = column from table  
   select @total = @total+sum(price)      
   from table      
   where ...)     
   set @res = @total   
  end     
 else     
  set @res1=0     
    
 return @@ret    
end [src]


Спасибо!
26 июн 13, 01:30    [14483443]     Ответить | Цитировать Сообщить модератору
 Re: помогите с функцией  [new]
Сергей Викт.
Member

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


create function [dbo].[udf_name]
(
@id1 int,
@id2 int,
@id3 int,
@id4 int
)
returns varchar(16)
begin
declare @res as int
declare @id as int
declare @total as varchar(16)

if exists ( select ... from ... where ...)
begin
select @res= column from table

return @res
end

if not exists (select ... from ... where ...)
begin
select @total = column from table
select @total = @total+sum(price)
from table
where ...)
set @res = @total
end
else
set @res1=0

return @@ret
end



Спасибо!

Добрый день.
А зачем вам 2 условия if exists и if not exist? и после второго ещё и else?
Или у вас (select ... from ... where...) разные для двух случаев?
Зачем заставлять сервер 2 раза выполнять запрос select from where (если он одинаков для двух случаев), если проще сделать if exists() BEGIN ... END ELSE BEGIN..END?
26 июн 13, 07:08    [14483595]     Ответить | Цитировать Сообщить модератору
 Re: помогите с функцией  [new]
Ruuu
Member

Откуда: Иркутск
Сообщений: 4272
temoxa
Всем привет. Вот столкнулся со скалярной функцией на которой затык получился, почитал и гуру пишут, что скалярные функции на производительность плохо влияют...
Какой затык? Нужно смотреть планы запросов и показывать их другим, если хотите чтобы вам помогли.
26 июн 13, 07:31    [14483604]     Ответить | Цитировать Сообщить модератору
 Re: помогите с функцией  [new]
hoha_ftf
Member

Откуда: ЕКБ
Сообщений: 42
temoxa, еще одна секретная функция?
А вообще, даже оптимизированная UDF, вызванная в SELECT несколько тысяч раз, будет плохо влиять на производительность.
26 июн 13, 08:11    [14483641]     Ответить | Цитировать Сообщить модератору
 Re: помогите с функцией  [new]
imato
Member

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

Единственная возможность оптимизировать - это убрать данную функцию и нормально переписать тот селект, в котором она участвует для получения того же результата, оптимизировать весь запрос целиком.
26 июн 13, 09:24    [14483881]     Ответить | Цитировать Сообщить модератору
 Re: помогите с функцией  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31438
temoxa
гуру пишут, что скалярные функции на производительность плохо влияют... Вот есть функции, может кто-нить что подскажет по оптимизации
Правильно пишут, уберите функцию.
26 июн 13, 09:47    [14483966]     Ответить | Цитировать Сообщить модератору
 Re: помогите с функцией  [new]
temoxa
Member

Откуда:
Сообщений: 405
alexeyvg, что в конце концов и сделал)) всем спасибо.
28 июн 13, 09:32    [14495569]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить