2014-09-11 3 views
0

Я не являюсь db-парнем. Можете ли вы поделиться своими взглядами, улучшив следующий пример sp, например, используя глобальную временную таблицу или индексы или можете улучшить существующие запросы. В исходном коде я буду иметь много много запросов на обновление для разных таблиц. Спасибо!Улучшение производительности хранимой процедуры

CREATE OR REPLACE PROCEDURE SYSTEM.process_log1 
IS 
    cursor cur_attuid_change is 
select 
    sup.id as id, 
    sup.name as name, 
    sup.role as role, 
    sup.technology as technology 
from main hr, secondary sup 
where sup.id=hr.id; 

BEGIN 
    -- update records in main tables from the cursor 
    for rec_attuid_change in cur_attuid_change loop 

    update main t1 
    set t1.id = rec_attuid_change.id, 
      t1.name = rec_attuid_change.name, 
      t1.ROLE=rec_attuid_change.role, 
      t1.technology=rec_attuid_change.technology 
    where t1.id = rec_attuid_change.id; 
    commit; 

    update main1 t1 
    set t1.id = rec_attuid_change.id, 
      t1.name = rec_attuid_change.name, 
      t1.ROLE=rec_attuid_change.role, 
      t1.technology=rec_attuid_change.technology 
    where t1.id = rec_attuid_change.id; 
    commit; 

    update main2 t1 
    set t1.id = rec_attuid_change.id, 
      t1.name = rec_attuid_change.name, 
      t1.ROLE=rec_attuid_change.role, 
      t1.technology=rec_attuid_change.technology 
    where t1.id = rec_attuid_change.id; 
    commit; 
    end loop; 


END; 

/

ответ

1

Попробуйте это:

CREATE OR REPLACE PROCEDURE SYSTEM.process_log1 

BEGIN 

    update main t1 
    set (t1.id, t1.name, t1.ROLE, t1.technology) = 
     (select 
     sup.id as id, 
     sup.name as name, 
     sup.role as role, 
     sup.technology as technology 
     from 
     main hr, 
     secondary sup 
     where 
      sup.id=hr.id 
      and sup.Id = t1.Id); 
    commit; 

    update main1 t1 
    set (t1.id, t1.name, t1.ROLE, t1.technology) = 
     (select 
     sup.id as id, 
     sup.name as name, 
     sup.role as role, 
     sup.technology as technology 
     from 
     main hr, 
     secondary sup 
     where 
      sup.id=hr.id 
      and sup.Id = t1.Id); 
    commit; 

    update main2 t1 
    set (t1.id, t1.name, t1.ROLE, t1.technology) = 
     (select 
     sup.id as id, 
     sup.name as name, 
     sup.role as role, 
     sup.technology as technology 
     from 
     main hr, 
     secondary sup 
     where 
      sup.id=hr.id 
      and sup.Id = t1.Id); 
    commit; 


END; 

Основная идея заключается в том, чтобы избавиться от курсора и позволить Oracle запустить Set операции (Установить как в например, диаграммы Венна, а не набор, как в установить что-то =). Он будет делать это намного быстрее, чем будет делать RAT (Row At a Time).

Я не 100% уверен в синтаксисе, но его от here, и около трети вниз страницы, у вас есть это:

SET (column_name, column_name, ...) = (subquery4)

Назначает значения, полученные из базы данных подзапросом4, в столбцы в списке column_name. Подзапрос должен возвращать ровно одну строку, которая включает все перечисленные столбцы. Значения столбцов, возвращаемые подзапросом, присваиваются столбцам в списке столбцов по порядку. Первое значение присваивается первому столбцу в списке, второе значение присваивается второму столбцу в списке и т. Д.

Смежные вопросы