On Aug 21, 6:17 am, sakthi <[email protected]> wrote:
> Hi Experts,
>
> I m have problem with sql delete statement.
>
> When the no. of records is less in my table , its getting deleted
> successfully with in a minute.
>
> But if my table have 10 lac records , and i m tried to delete some of
> 60000 records based on query condition,it is taking more then 3 hours
> to perform this operation.
> I m using oracle 10.2 g verion
>
> Please guide me to do the correct thing....
>
> Thanks in advance,
> Sakthi

Then supply the query plan for this delete as I suspect it's
performing a full table scan.  No one will know for certain until we
see how the optimizer has decided to execute that statement.  Let's
look at a rather extreme example:

SQL> --
SQL> -- Create test table
SQL> --
SQL> create table delete_test(
  2          recnum number not null,
  3          recid varchar2(40),
  4          recmode number not null,
  5          recdata varchar2(4000),
  6          addrecdata varchar2(4000)
  7  );

Table created.

SQL>
SQL> --
SQL> -- Populate test table
SQL> --
SQL> -- Rows will be longer than a single block
SQL> --
SQL> begin
  2          for i in 1..1000000 loop
  3                  insert into delete_test
  4                  values(i, 'ABXD'||i||'RFG'||i||'XZQY'||i||i, mod(i,16),
rpad('X', 4000, 'X'), rpad('Y', 4000, 'Y'));
  5          end loop;
  6
  7          commit;
  8
  9  end;
 10  /

PL/SQL procedure successfully completed.

SQL>
SQL> --
SQL> -- Gather statistics
SQL> --
SQL>
SQL> exec dbms_stats.gather_table_stats(ownname=>null,
tabname=>'DELETE_TEST', cascade=>true, estimate_percent=>null);

PL/SQL procedure successfully completed.

SQL>
SQL> set autotrace on timing on
SQL>
SQL> --
SQL> -- Delete ~60000 rows
SQL> --
SQL> -- Scan entire table for matching rows
SQL> --
SQL> delete from delete_test
  2  where recmode = 7;

62500 rows deleted.

Elapsed: 00:23:00.42  <--- note the time without an index

Execution Plan
----------------------------------------------------------
Plan hash value: 2974503846

----------------------------------------------------------------------------------
| Id  | Operation          | Name        | Rows  | Bytes | Cost
(%CPU)| Time     |
----------------------------------------------------------------------------------
|   0 | DELETE STATEMENT   |             | 62500 |   183K|   542K
(1)| 01:48:29 |
|   1 |  DELETE            | DELETE_TEST |       |       |
|          |
|*  2 |   TABLE ACCESS FULL| DELETE_TEST | 62500 |   183K|   542K
(1)| 01:48:29 |
----------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter("RECMODE"=7)


Statistics
----------------------------------------------------------
        853  recursive calls
     503350  db block gets
    4007359  consistent gets
    1997740  physical reads
  692471732  redo size
        680  bytes sent via SQL*Net to client
        570  bytes received via SQL*Net from client
          3  SQL*Net roundtrips to/from client
          4  sorts (memory)
          0  sorts (disk)
      62500  rows processed

SQL>
SQL> rollback;

Rollback complete.

Elapsed: 00:11:19.98
SQL>
SQL> --
SQL> -- Index the governing column
SQL> --
SQL> create index delete_test_idx
  2  on delete_test(recmode);

Index created.

Elapsed: 00:07:04.95
SQL>
SQL> --
SQL> -- Gather statistics
SQL> --
SQL>
SQL> exec dbms_stats.gather_table_stats(ownname=>null,
tabname=>'DELETE_TEST', cascade=>true, estimate_percent=>null);

PL/SQL procedure successfully completed.

Elapsed: 00:15:17.92
SQL>
SQL> --
SQL> -- Execute delete again
SQL> --
SQL> -- Use index
SQL> --
SQL> delete from delete_test
  2  where recmode = 7;

62500 rows deleted.

Elapsed: 00:09:18.54  <--- note the time with an index

Execution Plan
----------------------------------------------------------
Plan hash value: 719378220

-------------------------------------------------------------------------------------
| Id  | Operation         | Name            | Rows  | Bytes | Cost
(%CPU)| Time     |
-------------------------------------------------------------------------------------
|   0 | DELETE STATEMENT  |                 | 62500 |   183K|   125
(1)| 00:00:02 |
|   1 |  DELETE           | DELETE_TEST     |       |
|            |          |
|*  2 |   INDEX RANGE SCAN| DELETE_TEST_IDX | 62500 |   183K|   125
(1)| 00:00:02 |
-------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("RECMODE"=7)


Statistics
----------------------------------------------------------
        429  recursive calls
     501814  db block gets
        299  consistent gets
     117175  physical reads
  540836956  redo size
        680  bytes sent via SQL*Net to client
        570  bytes received via SQL*Net from client
          3  SQL*Net roundtrips to/from client
          3  sorts (memory)
          0  sorts (disk)
      62500  rows processed

SQL>
SQL> commit;

Commit complete.

Elapsed: 00:00:00.00
SQL>

Remember these rows were chained, which dramatically increased the
processing time.  If we choose to not chain rows:

SQL> --
SQL> -- Create test table
SQL> --
SQL> create table delete_test(
  2          recnum number not null,
  3          recid varchar2(40),
  4          recmode number not null,
  5          recdata varchar2(1000)
  6  );

Table created.

SQL>
SQL> --
SQL> -- Populate test table
SQL> --
SQL> begin
  2          for i in 1..1000000 loop
  3                  insert into delete_test
  4                  values(i, 'ABXD'||i||'RFG'||i||'XZQY'||i||i, mod(i,16),
rpad('X', 999, 'X'));
  5          end loop;
  6
  7          commit;
  8
  9  end;
 10  /

PL/SQL procedure successfully completed.

SQL>
SQL> --
SQL> -- Gather statistics
SQL> --
SQL>
SQL> exec dbms_stats.gather_table_stats(ownname=>null,
tabname=>'DELETE_TEST', cascade=>true, estimate_percent=>null);

PL/SQL procedure successfully completed.

SQL>
SQL> set autotrace on timing on
SQL>
SQL> --
SQL> -- Delete ~60000 rows
SQL> --
SQL> -- Scan entire table for matching rows
SQL> --
SQL> delete from delete_test
  2  where recmode = 7;

62500 rows deleted.

Elapsed: 00:01:53.22   <--- without index

Execution Plan
----------------------------------------------------------
Plan hash value: 2974503846

----------------------------------------------------------------------------------
| Id  | Operation          | Name        | Rows  | Bytes | Cost
(%CPU)| Time     |
----------------------------------------------------------------------------------
|   0 | DELETE STATEMENT   |             | 62500 |   183K| 46483
(1)| 00:09:18 |
|   1 |  DELETE            | DELETE_TEST |       |       |
|          |
|*  2 |   TABLE ACCESS FULL| DELETE_TEST | 62500 |   183K| 46483
(1)| 00:09:18 |
----------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter("RECMODE"=7)


Statistics
----------------------------------------------------------
        116  recursive calls
     143528  db block gets
     333480  consistent gets
     164413  physical reads
   97068784  redo size
        681  bytes sent via SQL*Net to client
        570  bytes received via SQL*Net from client
          3  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
      62500  rows processed

SQL>
SQL> rollback;

Rollback complete.

Elapsed: 00:01:51.40
SQL>
SQL> --
SQL> -- Index the governing column
SQL> --
SQL> create index delete_test_idx
  2  on delete_test(recmode);

Index created.

Elapsed: 00:00:37.65
SQL>
SQL> --
SQL> -- Gather statistics
SQL> --
SQL>
SQL> exec dbms_stats.gather_table_stats(ownname=>null,
tabname=>'DELETE_TEST', cascade=>true, estimate_percent=>null);

PL/SQL procedure successfully completed.

Elapsed: 00:00:52.01
SQL>
SQL> --
SQL> -- Execute delete again
SQL> --
SQL> -- Use index
SQL> --
SQL> delete from delete_test
  2  where recmode = 7;

62500 rows deleted.

Elapsed: 00:01:08.34  <--- with index

Execution Plan
----------------------------------------------------------
Plan hash value: 719378220

-------------------------------------------------------------------------------------
| Id  | Operation         | Name            | Rows  | Bytes | Cost
(%CPU)| Time     |
-------------------------------------------------------------------------------------
|   0 | DELETE STATEMENT  |                 | 62500 |   183K|   125
(1)| 00:00:02 |
|   1 |  DELETE           | DELETE_TEST     |       |
|            |          |
|*  2 |   INDEX RANGE SCAN| DELETE_TEST_IDX | 62500 |   183K|   125
(1)| 00:00:02 |
-------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("RECMODE"=7)


Statistics
----------------------------------------------------------
        116  recursive calls
     144995  db block gets
        144  consistent gets
      47069  physical reads
   86034848  redo size
        681  bytes sent via SQL*Net to client
        570  bytes received via SQL*Net from client
          3  SQL*Net roundtrips to/from client
          2  sorts (memory)
          0  sorts (disk)
      62500  rows processed

SQL>
SQL> commit;

Commit complete.

Elapsed: 00:00:00.04
SQL>

Of course all of this is affected by the operating system, server
configuration (disks, available memory), instance configuration
(shared pool, large pool, pga aggregate), network speed, server and
database activity, disk latency ... too many items to speculate upon
without solid information.  These times, remember, are for deleting
the same number of records with and without an index; smaller volumes
of deleted data will take less time.

Until you supply much more information than you have already the best
we can do is speculate.  Give us usuable data and you can possibly get
usable answers.


David Fitzjarrell
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Oracle PL/SQL" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/Oracle-PLSQL?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to