Параллельная обработка данных из процедуры

bad2man
Дата: 05.03.2007 20:01:24
Есть процедура, которая создает курсор по переданному в процедуру условию
и производит необходимые вычисление с результатом курсора.
Если не передавать условие курсор выбирает все имеющиеся данные
в итоге время выполнения процедуры равно 3 часа (довольно большой обьем и сложные вычисления над данныеми)
Если запустить в трех разных сессиях процедуру с тремя разными условиями (деля весь обьем на разные части) то общее время обработки данных 1 час.

Скажите уважаемый народ, как сделать чтоб я запускал 1(один) раз процедуру без условий
в ней бы производились необходимые вычисления и в системе порождались БЫ три разные сессий ?

Вариант похож с параллельными запросами, но в данном случае мы имеем дело с процедурами.

Как вариант можно породить 3 джоба, и ждать их завершения, но .. может у кого есть более красивое решение ?
Elic
Дата: 05.03.2007 20:13:18
bad2man
как сделать чтоб я запускал 1(один) раз процедуру без условий
в ней бы производились необходимые вычисления и в системе порождались БЫ три разные сессий ?

Как вариант можно породить 3 джоба, и ждать их завершения
Другого не дано.
mcureenab
Дата: 05.03.2007 21:13:11
Так выполняй обработку результата параллельного SQL запроса в нескольких нитях. Какие проблемы?
_Tims_
Дата: 05.03.2007 21:45:24
я в таких случаях всегда параллелил по JOB-ам, если явное распарраллеливание запроса не применимо
bad2man
Дата: 06.03.2007 09:20:21
mcureenab
Так выполняй обработку результата параллельного SQL запроса в нескольких нитях. Какие проблемы?


поясни пож это на следующем примере

procedure proc_child(var1 in number) is
begin
for i in (select a from table1 where field1=var1) loop
....
end loop;
end;

нужно породить 3 раза и подождать завершение всеъ трех, из одной процедуры
procedure proc_parent;
begin
proc_child(1);
proc_child(2);
proc_child(3);
end;

но не последовательно, а параллельно
Elic
Дата: 06.03.2007 10:17:57
bad2man
нужно породить 3 раза и подождать завершение всеъ трех, из одной процедуры
procedure proc_parent;
begin
proc_child(1);
proc_child(2);
proc_child(3);
end;
но не последовательно, а параллельно
create procedure proc_child(n int, i int)
is
begin
  for x in (select * from all_objects where mod(object_id, n) = i) loop
    dbms_lock.sleep(0.01);
  end loop;
end;
/
show err

create procedure proc_parent(n int)
as
  type TJobs is table of int index by binary_integer;
  fJobs TJobs;
  fRunning boolean;
begin
  for i in 1..n loop
    dbms_job.submit(fJobs(i), 'proc_child('||n||','||(i-1)||');');
  end loop;
  commit;
  loop
    fRunning := false;
    <<Checking>>
    for i in 1..n loop
      for x in (select null from user_jobs where job = fJobs(i)) loop
        fRunning := true;
        exit Checking;
      end loop;
    end loop;
    exit when not fRunning;
  end loop;
end;
/
show err

set timing on
exec proc_parent(1)

PL/SQL procedure successfully completed.

Elapsed: 00:00:38.00

exec proc_parent(5)

PL/SQL procedure successfully completed.

Elapsed: 00:00:08.06
bad2man
Дата: 06.03.2007 12:12:57
Большое спасибо Elic !
но вопрос был именно в том чтоб не порождать джобы.
Elic
Дата: 06.03.2007 12:19:56
bad2man
но вопрос был именно в том чтоб не порождать джобы.
Для слабо слышащих и плохо видящих :)
mcureenab
Дата: 06.03.2007 13:07:07
bad2man
mcureenab
Так выполняй обработку результата параллельного SQL запроса в нескольких нитях. Какие проблемы?


поясни пож это на следующем примере

...



Засунь PL/SQL туда, где ему место. Если время выполнения сложной операции критично, используй для разработки метода C, C++. Написать программу постобработки на Pro*C/C++ не на много сложнее чем на PL/SQL, зато сколько возможностей для оптимизации открывается!
scela
Дата: 06.03.2007 14:38:21
смотри тут но енто если обработка более-менее простая. Хотя и достаточно сложную мы смогли упаковать в такиме вызовы.