Re: Deletion from large table

From: Mladen Gogala <gogala.mladen_at_gmail.com>
Date: Wed, 31 Aug 2016 15:36:58 -0400
Message-ID: <02ad5149-a4ef-5187-99c8-1b774d8ccb4a_at_gmail.com>



I have another trick up my sleeve, which wasn't mentioned. Basically, you can create a single table hash cluster containing the large table in question. All the rows that should be deleted will reside near each other, so the number of IO requests will be much smaller. However, this works the best when the row size is small.

On 08/31/2016 02:28 PM, Adric Norris wrote:
> In that sort of situation -- assuming that the CTAS / drop / rename
> suggestion can't be used -- I generally drop to PL/SQL bulk operations.
>
> declare
> type rowid_type is table of rowid index by pls_integer;
> v_rowids rowid_type;
>
> c_batchsize constant number := 1000000;
>
> cursor csr is
> select rowid from big_table
> where ...;
>
> begin
> open csr;
> loop
> fetch csr
> bulk collect into v_rowids
> limit c_batchsize;
> exit when v_rowids.COUNT = 0;
>
> forall c in 1..v_rowids.COUNT
> delete from big_table
> where rowid = v_rowids(c);
> commit;
> end loop;
> close csr;
> end;
> /
>

-- 
Mladen Gogala
Oracle DBA
Tel: (347) 321-1217


--
http://www.freelists.org/webpage/oracle-l
Received on Wed Aug 31 2016 - 21:36:58 CEST

Original text of this message