Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Какая функция отработает быстрее


alsov ©   (2006-12-07 17:17:00) 

Приветствую, Мастера
написал 2 функции, выполняющие одно и то же
Хотелось бы услышать мнение, какая из них быстрее будет работать

function is_value_exist(
                                aparameter_id IN NUMBER,
                                aworker_id IN NUMBER
                                ) return number
is
l_tmp number(10);
begin
 select 1 into l_tmp
 from stpir.value
 where parameter_id=aparameter_id and worker_id=aworker_id;
 return l_tmp;
exception
 when no_data_found then return null;
end is_measure_value_exist;

procedure worker_value_i(
                                aparameter_id IN NUMBER,
                                aworker_id IN NUMBER,
                                avalue IN NUMBER

                                )
IS

BEGIN
 if is_value_exist(aparameter_id, aworker_id) is null then
   INSERT INTO worker_value (
                                   parameter_ID,
                                   WORKER_ID,
                                   VALUE)
                           VALUES (
                                   aparameter_id,
                                   aworker_id,
                                   avalue);
 else
   update worker_value
      set value=value+avalue
   where parameter_id=aparameter_id and worker_id=aworker_id;
 end if;

END;


И вторая, написал через merge

procedure stpir_worker_value_i(
                                aworker_id in number,
                                aparameter_id in number,
                                avalue in number
                                )
is
begin
 merge into stpir.worker_value mwv
   using (select aparameter_id as parameter_id, aworker_id as worker_id from dual) d
         on (d.worker_id=mwv.worker_id and d.parameter_id=mwv.parameter_id)
   when matched then update set mwv.value=mwv.value+avalue
   when not matched then insert (mwv.worker_id, mwv.parameter_id, mwv.value)
                         values (aworker_id, aparameter_id, avalue);

end;


Заранее благодарен


ANB   (2006-12-07 19:04:00) [1]


> кстати в книжках пишут, што merge дает выигрыш в производительности
> на больших объемах

И не на больших тоже - проверяли. Я тоже написал с ифом, потом переписал на мерж. Быстрее.
PL/SQL вносит доп.тормоза.


k2   (2006-12-07 18:38:00) [2]

sql_trace, tkprof, runstats от Tom Kyte
кстати в книжках пишут, што merge дает выигрыш в производительности на больших объемах, интересно так ли это в данном конкретном случае


alsov   (2006-12-07 17:57:00) [3]


> Desdechado

А каким образом?


Desdechado   (2006-12-07 17:23:00) [4]

померить не проще?
тем более обращение к данным из таблиц


alsov   (2006-12-07 17:20:00) [5]

Вроде ставил галку
СУБД Oracle


Наверх

Титульная страница Поиск, карта сайта Написать письмо