create or replace package tmr authid definer is
procedure start_timer;
function elapsed return number;
procedure show_elapsed (
p_message in varchar2 default null
);
end tmr;
Package created.
create or replace package body tmr is
last_timing number := null;
procedure start_timer is
begin
last_timing := dbms_utility.get_time;
end;
function elapsed return number is
begin
return ( mod(dbms_utility.get_time - last_timing + power(2, 32), power(2, 32)) );
end;
procedure show_elapsed (
p_message in varchar2 default null
) is
begin
dbms_output.put_line(p_message || ' Elapsed: ' || elapsed);
end;
end tmr;
Package Body created.
drop table my_parts
Table dropped.
create table my_parts (
partnum number,
partname varchar2(15),
created timestamp,
created_by varchar2(100)
)
Table created.
create or replace procedure compare_inserting (
num in integer
) authid definer is
type NumTab is
table of my_parts.partnum%type index by binary_integer;
type NameTab is
table of my_parts.partname%type index by binary_integer;
pnums NumTab;
pnames NameTab;
begin
for indx in 1..num loop
pnums(indx) := indx;
pnames(indx) := 'Part ' || TO_CHAR(indx);
end loop;
tmr.start_timer;
for indx in 1..num loop
insert into my_parts (partnum, partname) values (
pnums(indx),
pnames(indx)
);
end loop;
tmr.show_elapsed('FOR loop ' || num);
rollback;
tmr.start_timer;
forall indx in 1..num
insert into my_parts (partnum, partname) values (
pnums(indx),
pnames(indx)
);
tmr.show_elapsed('FORALL ' || num);
rollback;
end;
Procedure created.
begin
dbms_output.put_line ('Just the insert...');
compare_inserting(10000);
compare_inserting(100000);
end;
Statement processed.
Just the insert...
FOR loop 10000 Elapsed: 14
FORALL 10000 Elapsed: 1
FOR loop 100000 Elapsed: 145
FORALL 100000 Elapsed: 6
create or replace trigger my_parts_briu before
insert or update on my_parts
for each row
begin
:new.created := current_timestamp;
:new.created_by := coalesce(sys_context('APEX$SESSION', 'APP_USER'), user);
end;
Trigger created.
begin
dbms_output.put_line ('With a trigger...');
compare_inserting(10000);
compare_inserting(100000);
end;
Statement processed.
With a trigger...
FOR loop 10000 Elapsed: 30
FORALL 10000 Elapsed: 6
FOR loop 100000 Elapsed: 446
FORALL 100000 Elapsed: 81
create or replace procedure set_audit_info (p_created out timestamp, p_created_by out varchar2)
authid definer
is
begin
p_created := current_timestamp;
p_created_by := coalesce(sys_context('APEX$SESSION', 'APP_USER'), user);
end;
Procedure created.
create or replace trigger my_parts_briu before
insert or update on my_parts
for each row
begin
set_audit_info(:new.created, :new.created_by );
end;
Trigger created.
begin
dbms_output.put_line ('With a trigger calling a proc...');
compare_inserting(10000);
compare_inserting(100000);
end;
Statement processed.
With a trigger calling a proc...
FOR loop 10000 Elapsed: 43
FORALL 10000 Elapsed: 8
FOR loop 100000 Elapsed: 396
FORALL 100000 Elapsed: 76