Ich muss fast 60k Datensätze einer Oracle-Tabelle über eine gespeicherte Prozedur verarbeiten. Die Verarbeitung besteht darin, dass ich für jede solche Zeile eine Zeile in einer zweiten Tabelle löschen und aktualisieren und eine Zeile in eine dritte Tabelle einfügen muss.Oracle Bulk Collect mit Limit und für alle, die nicht alle Datensätze korrekt verarbeiten
Mit Cursor-Looping dauert der Vorgang etwa 6-8 Stunden. Wenn ich zu Bulk Collect with Limit wechsle, wird die Ausführungszeit reduziert, aber die Verarbeitung ist nicht korrekt. Im Anschluss ist die Masse sammelt Version des Verfahrens
create or replace procedure myproc()
is
cursor c1 is select col1,col2,col3 from tab1 where col4=3;
type t1 is table of c1%rowtype;
v_t1 t1;
begin
open c1;
loop
fetch c1 bulk collect into v_t1 limit 1000;
exit when v_t1.count=0;
forall i in 1..v_t1.count
delete from tab2 where tab2.col1=v_t1(i).col1;
commit;
forall i in 1..v_t1.count
update tab2 set tab2.col1=v_t1(i).col1 where tab2.col2=v_t1(i).col2;
commit;
forall i in 1..v_t1.count
insert into tab3 values(v_t1(i).col1,v_t1(i).col2,v_t1(i).col3);
commit;
end loop;
close c2;
end;
Für rund 20k diese Aufzeichnungen, der erste Löschvorgang korrekt bearbeitet, jedoch nachfolgende Aktualisierung und einfügen wird nicht verarbeitet. Für die verbleibenden 40.000 Datensätze werden alle drei Operationen korrekt verarbeitet.
Fehle ich etwas? Was ist der maximale LIMIT-Wert, den ich mit Bulk Collect verwenden kann?
So wissen Sie über die Hauptschleife 60 mal durchlaufen, und Sie wissen, dass Sie 60k Löschungen aber 40k Updates tun und Einsätze? Wie prüfen/zählen Sie? –
Die Tabelle tab3 ist eine Protokolltabelle, die vor der Ausführung der Prozedur gelöscht wird. Wenn also nach Ausführung der Prozedur 40k Datensätze in dieser Tabelle vorhanden sind, bedeutet dies, dass 40k-Einträge erfolgreich waren. Die Tabelle (tab1) hat fast 2 * 60k Datensätze vor der Ausführung der Prozedur und nach der Ausführung ist die Anzahl der Datensätze 60k, was bedeutet, 60k Löschungen waren erfolgreich. –
OK, also ist tab2.col1 einzigartig? Ich versuche nicht, schwierig zu sein, versuche nur zu denken, was du vielleicht übersehen hast. –