Optimierung der Abfrage Löschen mit einer großen Anzahl von Daten auf oracle

Arbeite ich auf oracle 9i. Ich habe eine Tabelle mit 135,000,000 records, partitioniert, wobei jede partition mit ca. Zu 10.000.000 Zeilen. alle indizierten und alles.

Muss ich löschen um 70,000,000 Zeilen aus dieser die neue business-Anforderung.

So habe ich eine Sicherung der zu löschenden Zeilen als separate Tabelle.

Table1 <col1, col2........> -- main table (135,000,000 rows)

Table2 <col1, col2........> -- backup table (70,000,000 rows)

Versucht, die unterhalb Abfrage löschen.

Delete from table1 t1 where exists (select 1 from table2 t2 where t2.col1 = t1.col1)

aber es dauert unendlich Stunden.

dann versucht

declare
cursor c1 is 
select col1 from table2;
c2 c1%rowtype;
cnt number;
begin
cnt :=0;
open c1;
loop
    fetch c1 into c2;
    exit when c1%notfound;

    delete from table1 t1 where t1.col1 = c2.col1;
    if cnt >= 100000 then
        commit;
    end if;
    cnt:=cnt+1;
end loop;
close c1;
end;

sogar noch seine schon seit mehr als 12 Stunden. und immer noch nicht abgeschlossen.

Bitte beachten Sie, dass es mehrere Indizes auf Tabelle1 und ein index über col1 auf Tabelle2. alle Tabellen und Indizes werden analysiert.

Bitte beraten, ob es eine Möglichkeit der Optimierung für dieses Szenario.

Danke Jungs.

  • Wenn der code wirklich so aussieht, das Sie Begehen werden, für jede Zeile nach Zeile 100000, das ist wahrscheinlich nicht das, was Sie wollen und werden langsam natürlich. Stellen Sie Ihre cnt:=0 nach dem commit
  • Ya-Zähler zurücksetzen muss, ich glaube, das war ein Tippfehler ausgelassen. Aber ich zog es vor, fallen die Indizes und simulieren, wie die top-Antwort
InformationsquelleAutor Jude F'do | 2012-03-20
Schreibe einen Kommentar