PL/SQL Oracle Commit alle 1000 Datensätze

Hallo ich habe 100 Verschiedene SQL Befehle die so ausehen:

Delete * from TabelleA;
Delete * from TabelleB;
Delete * from TabelleC where Name = „Katze“;

In den Tabellen sind immer ca 10000000000 Datensätze zu löschen.

Es wird automatisch ein rollbag-segment angelegt und das dauert dann sehr lange.

1 Kann man das rollbag-segment auschalten
2 gibt es was z.B alle 1000 Datensätze einen commit zu machen ?

PS. Aus einer Delete-Anweisungen sollen nicht mehrerer gemacht werden !

hi!

bist nicht der erste mit diesem problem (weniger die zeit, sondern die größe der rollbacksegmente verursachten uns ziemliche kopfschmerzen - nur für ein delete das segment auf 40gb vergrößern?)

möglichkeit 1 (bei deinen beispielen für tabelleA und B:
truncate table TabelleA;
truncate table TabelleA;

möglichkeit 2 (mit „where“-klausel) mit einer schleife

declare
cursor tc is
select *
from TabelleC where Name=„Katze“
for delete;
zaehler number := 0;
begin
for t in tc loop
delete from TabelleC where Current Of tc;
zaehler := zaehler + 1;
if (zaehler = 1000) then
commit;
zaehler := 0;
end if;
end loop;
end;

möglichkeit 3: spezielles monster-rollback-segment anlegen (so ein paar gb) und dieses dann der sql-transaction zuweisen mittels „alter session use rollback …“

geht dann auch ne spur schneller

grüße,
tomh

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo SAM!

Zusätzlich zu den von Tomh schon angeführten Möglichkeiten (truncate, Schleife, rollback segment vergrößern) habe ich eine alternative Schleife anzubieten:

begin
 loop
 delete from tabelle where rownum

Des weiteren gibt's zum TRUNCATE noch einiges zu sagen. Genaueres hier:
http://www.wer-weiss-was.de/cgi-bin/forum/showarchive.fpl?ArtikelID=949183&archived=1&searchtext=&x=1&special=my&my\_forum=on&my\_archive=on&theme=0&offset=20

Gruß,
TheBeast


> <small>[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]</small>