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]
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>