Performance issue bulk inserting CLOBs
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;