Skip to Main Content

SQL & PL/SQL

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Performance issue bulk inserting CLOBs

user7996469Apr 21 2010 — edited Apr 21 2010
Hi I'm having trouble bulk collecting/inserting records that use a clod datatype. see below


drop table test_audit;

drop table test_metro;

CREATE TABLE Test_AUDIT
(
COMPLAINT_AUDIT_ID NUMBER(15),
RECORD CLOB,
ACTION VARCHAR2(1 BYTE)
);

CREATE TABLE Test_METRO( METRO_ID NUMBER(15));

begin
for i in 1..3000 loop
insert into Test_METRO values (i+1000);
end loop;
commit;
end;
/

select count(*) from Test_METRO;

-- Just bulk collect

set serveroutput on
DECLARE

type audit_tab is table of Test_AUDIT%rowtype;
l_audit_tab2 audit_tab;

BEGIN
dbms_output.put_line('Hi there '||to_char(sysdate, 'DD-MON-YYYY HH:MI:SS'));
select METRO_ID, 'test','I'
bulk collect into l_audit_tab2
from Test_METRO;
dbms_output.put_line('count ' || l_audit_tab2.count||to_char(sysdate, 'DD-MON-YYYY HH:MI:SS'));

END;
/

-- Bulk Collect and insert
set serveroutput on
DECLARE

type audit_tab is table of Test_AUDIT%rowtype;
l_audit_tab2 audit_tab;

BEGIN
dbms_output.put_line('Hi there '||to_char(sysdate, 'DD-MON-YYYY HH:MI:SS'));
select METRO_ID, 'test','I'
bulk collect into l_audit_tab2
from Test_METRO;
dbms_output.put_line('count ' || l_audit_tab2.count);
forall i in l_audit_tab2.first .. l_audit_tab2.last
insert into Test_AUDIT values l_audit_tab2(i);

dbms_output.put_line('Commit ');
commit;
dbms_output.put_line('Done '||to_char(sysdate, 'DD-MON-YYYY HH:MI:SS'));
END;
/

the Bulk Collect and insert takes approx 30mins for 3000 recs, i need to get this working for 7mill recs and done under 30 mins . Is this possible? I know there is an inherent performance issue with clob dml. FYI using a plain cursor for loop this takes about 1 sec

DECLARE

BEGIN
dbms_output.put_line('Hi there '||to_char(sysdate, 'DD-MON-YYYY HH:MI:SS'));

for x in (select METRO_ID from Test_METRO) loop

insert into Test_AUDIT values (x.metro_id,'test','i');

end loop;
dbms_output.put_line('Commit ');
commit;
dbms_output.put_line('Done '||to_char(sysdate, 'DD-MON-YYYY HH:MI:SS'));
END;
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on May 19 2010
Added on Apr 21 2010
3 comments
2,053 views