Home » RDBMS Server » Performance Tuning » Pass parameter to DML or new procedure?
Pass parameter to DML or new procedure? [message #65984] |
Tue, 15 February 2005 11:55  |
Xenofon Grigoriadis
Messages: 33 Registered: May 2002
|
Member |
|
|
Hi,
I want to know what is the better thing to do from a performance view point, when I have lots of inserts to do and one of the field values to be inserted only varies from say, only 1 to 4.
From the programming style view, I should pass this parameter to the procedure and lastly to the insert statement. I wonder whether it makes a difference if i have a dedicated procedure for each value of the parameter.
Anybody any idea? I've already made a test, but am not sure how to interpret the results, which seem not giving any clear clue.
Thankful for any helpful thought on that.
Xenofon
|
|
|
|
|
|
Re: Pass parameter to DML or new procedure? [message #65991 is a reply to message #65989] |
Thu, 17 February 2005 01:09   |
Xenofon Grigoriadis
Messages: 33 Registered: May 2002
|
Member |
|
|
Ok.
So here is the table and the package script:
"
set serveroutput on
set linesize 200
drop table ttable2;
create table ttable2
(
t1_id integer,
t1_bez varchar2(60),
t1_fac integer
);
-- Package zum Performance-Testing für konditionelle Anweisungen
create or replace package test is
procedure proc_param(param IN integer,
recno IN integer);
procedure proc1(recno IN integer);
procedure proc2(recno IN integer);
end;
/
create or replace package body test is
--
-- Prozedur proc_param
procedure proc_param(param IN integer ,
recno IN integer ) is
i integer := 0;
imax integer := 0;
t1 integer := 0;
t2 integer := 0;
begin
dbms_output.enable(1000000);
t1 := dbms_utility.get_time;
select nvl(max(t1_id),0) into imax from ttable2;
for i in imax..imax+recno
loop
insert into ttable2 values (i,to_char(i)||' row(s)', param);
end loop;
commit;
t2 := dbms_utility.get_time;
dbms_output.put_line('test_cond1.proc_param - Time elapsed: '||to_char((t2-t1)/100,'09.99'));
exception
when others then
dbms_output.put_line(sqlerrm);
rollback;
end;-- End of procedure test_c1
--
-- Prozedur proc1
procedure proc1(recno IN integer ) is
i integer := 0;
imax integer := 0;
t1 integer := 0;
t2 integer := 0;
begin
dbms_output.enable(1000000);
t1 := dbms_utility.get_time;
select nvl(max(t1_id),0) into imax from ttable2;
for i in imax..imax+recno
loop
insert into ttable2 values (i,to_char(i)||' row(s)', 1);
end loop;
commit;
t2 := dbms_utility.get_time;
dbms_output.put_line('test_cond2.proc1 - Time elapsed: '||to_char((t2-t1)/100,'09.99'));
exception
when others then
dbms_output.put_line(sqlerrm);
rollback;
end;-- End of procedure test_c1
--
-- Prozedur proc2
procedure proc2(recno IN integer ) is
i integer := 0;
imax integer := 0;
t1 integer := 0;
t2 integer := 0;
begin
dbms_output.enable(1000000);
t1 := dbms_utility.get_time;
select nvl(max(t1_id),0) into imax from ttable2;
for i in imax..imax+recno
loop
insert into ttable2 values (i,to_char(i)||' row(s)', 2);
end loop;
commit;
t2 := dbms_utility.get_time;
dbms_output.put_line('test_cond2.proc2 - Time elapsed: '||to_char((t2-t1)/100,'09.99'));
exception
when others then
dbms_output.put_line(sqlerrm);
rollback;
end;-- End of procedure test_c1
--
end;-- End of package test
/
show error
"
and here is the test-script:
"
set echo off
set feedback off
set showmode off
set termout on
set serveroutput on
set verify off
set linesize 100
define ROWS=&1
spool test_cond_&&ROWS.rows.log
truncate table ttable2 drop storage;
begin
test.proc_param(1,&&ROWS.);
test.proc_param(2,&&ROWS.);
end;
/
truncate table ttable2 drop storage;
begin
test.proc1(&&ROWS.);
test.proc2(&&ROWS.);
end;
/
spool off
show error
"
I've been using the test-script for 10.000 rows. I repeated this test 4 times.
|
|
|
Re: Pass parameter to DML or new procedure? [message #109186 is a reply to message #65991] |
Tue, 22 February 2005 15:51  |
Todd Barry
Messages: 4819 Registered: August 2001
|
Senior Member |
|
|
I see no statistically significant difference between the two calls to proc_param and the sequential calls to proc1/proc2.
Here are my results on two runs:
Enter value for 1: 10000
test_cond1.proc_param - Time elapsed: 02.90
test_cond1.proc_param - Time elapsed: 02.88
test_cond2.proc1 - Time elapsed: 02.83
test_cond2.proc2 - Time elapsed: 02.78
sql>@c:\test
Enter value for 1: 10000
test_cond1.proc_param - Time elapsed: 02.87
test_cond1.proc_param - Time elapsed: 02.90
test_cond2.proc1 - Time elapsed: 02.83
test_cond2.proc2 - Time elapsed: 02.84
You know the saying about concentrating on "low-hanging fruit." I would "major on the majors" - spend your time on more critical areas.
|
|
|
Goto Forum:
Current Time: Fri May 02 05:24:50 CDT 2025
|