tplanitz
Erfahrenes Mitglied
Hallo,
ich hänge hier meine procedur ein die folgendes machen soll, hoffentlich hat jemand Muße mir zu helfen:
In einer Quelldatenbank sollen Nachrichten eines bestimmten Types gefunden werden und diese in einer Zieltabelle abgelegt werden.
Es handelt sich um mehrere millionen Datensätze die gefunden werden können.
Nachdem ich mich in das Thema BULK COLLECT eingearbeitet habe hatte ich bei kleinen Datenmengen ca. einen Faktor 100 (Geschwindigkeit) beim importieren. Jetzt wo ich die Procedur für > 1000 000 Datensätze verwende dauert es quälend lange bis die Daten kopiert sind.
Habt Ihr ne Idee was ich falsch mache?
Kurz zur Procedur:
-- Selecte mir alle Nachrichten des Typs LL in der Quelltabelle
-- Schreibe jeweils 10000 Datensätze in die Zieltabelle
-- Wenn 20000 Datensätze geschrieben wurden soll commited werden (das mußte ich machen damit das ROLL Back Segment nicht überläuft)
-- Ich hätte auch gerne nach jedem COMMIT eine Ausgabe in der SQL-PLUS Konsole, das klappt hier leider nur wenn das Programm fertig ist.Dann werden alle Zeilen auf einmal geschrieben Hm... evtl. habt Ihr nen Ansatz.
Schon jetzt vielen Dank für Anregungen.
Viele Grüße
Thorsten
ich hänge hier meine procedur ein die folgendes machen soll, hoffentlich hat jemand Muße mir zu helfen:
In einer Quelldatenbank sollen Nachrichten eines bestimmten Types gefunden werden und diese in einer Zieltabelle abgelegt werden.
Es handelt sich um mehrere millionen Datensätze die gefunden werden können.
Nachdem ich mich in das Thema BULK COLLECT eingearbeitet habe hatte ich bei kleinen Datenmengen ca. einen Faktor 100 (Geschwindigkeit) beim importieren. Jetzt wo ich die Procedur für > 1000 000 Datensätze verwende dauert es quälend lange bis die Daten kopiert sind.
Habt Ihr ne Idee was ich falsch mache?
Kurz zur Procedur:
-- Selecte mir alle Nachrichten des Typs LL in der Quelltabelle
-- Schreibe jeweils 10000 Datensätze in die Zieltabelle
-- Wenn 20000 Datensätze geschrieben wurden soll commited werden (das mußte ich machen damit das ROLL Back Segment nicht überläuft)
-- Ich hätte auch gerne nach jedem COMMIT eine Ausgabe in der SQL-PLUS Konsole, das klappt hier leider nur wenn das Programm fertig ist.Dann werden alle Zeilen auf einmal geschrieben Hm... evtl. habt Ihr nen Ansatz.
Schon jetzt vielen Dank für Anregungen.
PHP:
CREATE OR REPLACE PROCEDURE Pd_Copy_Message_Fast IS
TYPE myarray IS TABLE OF T_RAW_MESSAGE%ROWTYPE;
l_data myarray;
v_CommitAbstand NUMBER (5) := 0;
v_data_array_cnt NUMBER (5) :=0;
CURSOR copy_curser IS
SELECT DISTINCT A_RAW_MESSAGE_ID
, A_DEVICE_ID
, A_MESSAGE_TYPE_ID
, A_REGION_ID
, A_TIMESTAMP
, A_DATE
FROM T_RAW_MESSAGE
JOIN T_RAW_MESSAGE_TYPE USING (a_raw_message_type_id)
WHERE a_raw_message_type_name = 'LL';
BEGIN
OPEN copy_curser;
LOOP
v_CommitAbstand := v_CommitAbstand +1;
v_data_array_cnt := v_data_array_cnt +1;
FETCH copy_curser BULK COLLECT INTO l_data LIMIT 10000;
FORALL i IN 1..l_data.COUNT
INSERT INTO T_RAW_MESSAGE_COPY VALUES l_data(i);
IF v_CommitAbstand = 2
THEN COMMIT;
DBMS_OUTPUT.PUT_LINE('committed bei ' || v_CommitAbstand); -- Das soll in der Konsole ausgegeben werden
DBMS_OUTPUT.PUT_LINE('data array Nr. = ' || v_data_array_cnt); -- Das soll in der Konsole ausgegeben werden, zeigt die Anzahl der Pakete an
v_CommitAbstand := 0;
END IF;
EXIT WHEN copy_curser%NOTFOUND;
END LOOP;
COMMIT; -- Sichewrheitshalber noch mal alles committen
CLOSE copy_curser;
END Pd_Copy_Message_Fast;
/
Viele Grüße
Thorsten
Zuletzt bearbeitet: