Oracle FAQ Your Portal to the Oracle Knowledge Grid
HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US
 

Home -> Community -> Usenet -> c.d.o.misc -> Re: efficienci CURSOR+INSERT vs. INSERT INTO ... SELECT

Re: efficienci CURSOR+INSERT vs. INSERT INTO ... SELECT

From: Niall Litchfield <n-litchfield_at_audit-commission.gov.uk>
Date: Tue, 1 Jul 2003 12:02:01 +0100
Message-ID: <3f016a29$0$18493$ed9e5944@reading.news.pipex.net>


"Francois Berger" <berger_at_fire.shacknet.nu> wrote in message news:Pine.LNX.4.44.0307011152300.11426-100000_at_fire.shacknet.nu...
> Hi all,
> I have a large amount of data issued from a select to insert into a table
> Currently, I am doing a loop with a cursor and an inser statement.
> Looks like:
> CURSOR my_cursor is ...;
> FOR my_record in my_cursor LOOP
> INSERT INTO ... VALUES (my_record.name, my_record.size, ...);
> END LOOP;
>
> I was wondering if something like INSERT INTO ... SELECT... was not more
> efficient:
> INSERT INTO... SELECT name, size FROM....;

If you do the insert once as opposed to n times it should always be faster, in addition generally (already parsed) SQL is faster than PL/SQL. This leads to the following (I think conclusive test

SQL> truncate table t1;

Table truncated.

SQL> desc t1;

 Name                                      Null?    Type
 ----------------------------------------- -------- ------------------------
----
 T_NAME                                    NOT NULL VARCHAR2(30)
 T_SIZE                                             NUMBER

SQL> set timing on
SQL> insert into t1 select object_name,object_id from all_objects;

39042 rows created.

Elapsed: 00:00:04.03
SQL> rollback;

Rollback complete.

Elapsed: 00:00:00.00
SQL> insert into t1 select object_name,object_id from all_objects;

39042 rows created.

Elapsed: 00:00:02.01
SQL> rollback;

Rollback complete.

Elapsed: 00:00:00.00
SQL> insert into t1 select object_name,object_id from all_objects;

39042 rows created.

Elapsed: 00:00:02.02
SQL> rollback;

Rollback complete.

Elapsed: 00:00:00.00
SQL> declare
  2 CURSOR my_cursor is select object_name,object_id from all_objects;   3 begin
  4 FOR my_record in my_cursor LOOP
  5 INSERT INTO t1 VALUES (my_record.object_name, my_record.object_id);   6 END LOOP;
  7 end;
  8 /

PL/SQL procedure successfully completed.

Elapsed: 00:00:10.02
SQL> rollback;

Rollback complete.

Elapsed: 00:00:00.09
SQL> declare
  2 CURSOR my_cursor is select object_name,object_id from all_objects;   3 begin
  4 FOR my_record in my_cursor LOOP
  5 INSERT INTO t1 VALUES (my_record.object_name, my_record.object_id);
  6 END LOOP;
  7 end;
  8 /
  9 .
SQL> declare
  2 CURSOR my_cursor is select object_name,object_id from all_objects;   3 begin
  4 FOR my_record in my_cursor LOOP
  5 INSERT INTO t1 VALUES (my_record.object_name, my_record.object_id);   6 END LOOP;
  7 end;
  8 /

PL/SQL procedure successfully completed.

Elapsed: 00:00:09.07
SQL> 2 secs beats 9 secs by a considerable margin.

-- 
Niall Litchfield
Oracle DBA
Audit Commission UK
Received on Tue Jul 01 2003 - 06:02:01 CDT

Original text of this message

HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US