1. 程式人生 > >比較dbms_job幾個模擬多執行緒方法在呼叫延遲上的差異

比較dbms_job幾個模擬多執行緒方法在呼叫延遲上的差異

目的:比較幾個多執行緒方法在呼叫延遲上的差異。 1.dbms_job.submit; 2.dbms_job.isubmit; 3.dbms_job.run; 4.dbms_job.broken; 這幾種都能呼叫新JOB,模擬多執行緒,比較這幾種方式的差異。 實驗內容:連續呼叫起100個執行緒,每10個後sleep(1),記錄每個執行緒的調起時間,且從kect_testa表隨機取一條記錄插入到kect_testb表。每個執行緒完成kect_testb.pre_start_time的更新。通過比較kect_testb.pre_start_time與ins_time的時間差可以得到延遲時長(select pre_start_time-ins_time,t.ins_time,t.pre_start_time from kect_testb t;)。 實驗結論:
dbms_job.run從job起調到新執行緒的開始執行的延遲最短。 1.dbms_job.submit; 1.386~5.916秒 2.dbms_job.isubmit; 1.214~6.020秒 3.dbms_job.run; 0.013~0.017秒 4.dbms_job.broken; 0.428~5.812秒 create table kect_testa( id number, name varchar2(30), type varchar2(30) ); / insert into kect_testa select rownum,object_name,object_type from user_objects; / create table kect_testb( thread_id number, ins_time timestamp(3), id number, name varchar2(30), type varchar2(30), pre_start_time timestamp(3), pre_stop_time timestamp(3) ); / 1.從以下程式碼執行結果看,從JOB起調到執行緒開始執行延遲1.386~5.916秒。(看kect_testb.pre_start_time與ins_time的時間差) create or replace package KECT_TEST is procedure main;
procedure pre_run(p_thread_id number); end KECT_TEST; / create or replace package body KECT_TEST is procedure main as
l_rec_a kect_testa%rowtype;
l_rec_b kect_testb%rowtype;
l_sql varchar2(1000);
begin
for x in 1..100 loop
l_rec_a:=null;
l_rec_b:=null;
if mod(x,10)=0 then
dbms_lock.sleep(1);
end if;
l_rec_b.id:=round(dbms_random.value(1,10000));
select * into l_rec_a from kect_testa
where id=l_rec_b.id;
l_rec_b.id :=l_rec_a.id;
l_rec_b.name:=l_rec_a.name;
l_rec_b.type:=l_rec_a.type;
l_rec_b.thread_id:=x;
l_rec_b.ins_time :=systimestamp;
insert into kect_testb values l_rec_b;
commit;
l_sql:='declare ';
l_sql:=l_sql||'l_job number; ';
l_sql:=l_sql||'begin ';
l_sql:=l_sql||'dbms_job.submit(l_job,''kect_test.pre_run('||x||');'');';
l_sql:=l_sql||'end;';
execute immediate l_sql; commit;
end loop;
end main;

procedure pre_run(p_thread_id number) as
l_rec_b kect_testb%rowtype;
begin
l_rec_b.pre_start_time:=systimestamp;
update kect_testb set pre_start_time=l_rec_b.pre_start_time
where thread_id=p_thread_id;
commit;
end pre_run;

end KECT_TEST; / 2.從以下程式碼執行結果看,從JOB起調到執行緒開始執行延遲1.214~6.020秒。(看kect_testb.pre_start_time與ins_time的時間差) create or replace package KECT_TEST is procedure main;
procedure pre_run(p_thread_id number); end KECT_TEST; / create or replace package body KECT_TEST is procedure main as
l_rec_a kect_testa%rowtype;
l_rec_b kect_testb%rowtype;
l_sql varchar2(1000);
l_jobid number;
l_exists number;
begin
for x in 1..100 loop
l_rec_a:=null;
l_rec_b:=null;
if mod(x,10)=0 then
dbms_lock.sleep(1);
end if;
loop
l_jobid:=round(dbms_random.value(1000,2000));
select count(*) into l_exists from user_jobs
where job=l_jobid;
exit when l_exists=0;
end loop;
l_rec_b.id:=round(dbms_random.value(1,10000));
select * into l_rec_a from kect_testa
where id=l_rec_b.id;
l_rec_b.id :=l_rec_a.id;
l_rec_b.name:=l_rec_a.name;
l_rec_b.type:=l_rec_a.type;
l_rec_b.thread_id:=x;
l_rec_b.ins_time :=systimestamp;
insert into kect_testb values l_rec_b;
commit;
l_sql:='begin ';
l_sql:=l_sql||'dbms_job.isubmit(:1,''kect_test.pre_run('||x||');'',:2);';
l_sql:=l_sql||'end;';
execute immediate l_sql using l_jobid,sysdate; commit;
end loop;
end main;

procedure pre_run(p_thread_id number) as
l_rec_b kect_testb%rowtype;
begin
l_rec_b.pre_start_time:=systimestamp;
update kect_testb set pre_start_time=l_rec_b.pre_start_time
where thread_id=p_thread_id;
commit;
end pre_run;

end KECT_TEST; / 3.從以下程式碼執行結果看,從JOB起調到執行緒開始執行延遲0.013~0.017秒。(看kect_testb.pre_start_time與ins_time的時間差) create or replace package KECT_TEST is procedure main;
procedure pre_run(p_thread_id number); end KECT_TEST; / create or replace package body KECT_TEST is
procedure main as
l_rec_a kect_testa%rowtype;
l_rec_b kect_testb%rowtype;
l_sql varchar2(1000);
l_jobid number;
begin
for x in 1..100 loop
l_jobid:=x+1000;
--用於建立JOB --l_sql:='begin ';
--l_sql:=l_sql||'dbms_job.isubmit('||l_jobid||',''kect_test.pre_run('||x||');'',:2,''sysdate+1000'');';
--l_sql:=l_sql||'end;';
--execute immediate l_sql using sysdate+1000;
--commit;

l_rec_a:=null;
l_rec_b:=null;
if mod(x,10)=0 then
dbms_lock.sleep(1);
end if;
l_rec_b.id:=round(dbms_random.value(1,10000));
select * into l_rec_a from kect_testa
where id=l_rec_b.id;
l_rec_b.id :=l_rec_a.id;
l_rec_b.name:=l_rec_a.name;
l_rec_b.type:=l_rec_a.type;
l_rec_b.thread_id:=x;
l_rec_b.ins_time :=systimestamp;
insert into kect_testb values l_rec_b;
commit;
l_sql:='begin ';
l_sql:=l_sql||'dbms_job.run('||l_jobid||');';
l_sql:=l_sql||'end;';
execute immediate l_sql;
commit;
end loop;
end main;

procedure pre_run(p_thread_id number) as
l_rec_b kect_testb%rowtype;
begin
l_rec_b.pre_start_time:=systimestamp;
update kect_testb set pre_start_time=l_rec_b.pre_start_time
where thread_id=p_thread_id;
commit;
end pre_run;

end KECT_TEST; / 4.從以下程式碼執行結果看,從JOB起調到執行緒開始執行延遲0.428~5.812秒。(看kect_testb.pre_start_time與ins_time的時間差) create or replace package KECT_TEST is procedure main;
procedure pre_run(p_thread_id number); end KECT_TEST; / create or replace package body KECT_TEST is
procedure main as
l_rec_a kect_testa%rowtype;
l_rec_b kect_testb%rowtype;
l_sql varchar2(1000);
l_jobid number;
begin
for x in 1..100 loop
l_jobid:=x+1000;
--用於建立JOB
--l_sql:='begin ';
--l_sql:=l_sql||'dbms_job.isubmit('||l_jobid||',''kect_test.pre_run('||x||');'',:2,''sysdate+1000'');';
--l_sql:=l_sql||'end;';
--execute immediate l_sql using sysdate+1000;
--commit;

l_rec_a:=null;
l_rec_b:=null;
if mod(x,10)=0 then
dbms_lock.sleep(1);
end if;
l_rec_b.id:=round(dbms_random.value(1,10000));
select * into l_rec_a from kect_testa
where id=l_rec_b.id;
l_rec_b.id :=l_rec_a.id;
l_rec_b.name:=l_rec_a.name;
l_rec_b.type:=l_rec_a.type;
l_rec_b.thread_id:=x;
l_rec_b.ins_time :=systimestamp;
insert into kect_testb values l_rec_b;
commit;
l_sql:='begin ';
l_sql:=l_sql||'dbms_job.broken('||l_jobid||',false,:2);';
l_sql:=l_sql||'end;';
execute immediate l_sql using sysdate;
commit;
end loop;
end main;

procedure pre_run(p_thread_id number) as
l_rec_b kect_testb%rowtype;
begin
l_rec_b.pre_start_time:=systimestamp;
update kect_testb set pre_start_time=l_rec_b.pre_start_time
where thread_id=p_thread_id;
commit;
end pre_run;

end KECT_TEST;
/