Oracle 9.2.0.6i; Auto Commit

tplanitz

Erfahrenes Mitglied
Hallo und frohe Weihnachten,

habe eine Frage zum Committen bei SEHR vielen Datensätzen (ca. 5.000.000). Ich muß eine Tabelle kopieren und jedesmal dauert das bis zu 3,5 Stunden und das ROLLBACK Segment hat einen Überlauf.
Jetzt habe ich mir überlegt das es gut wäre nach n Datensätzen ein COMMIT durchzuführen
das mache ich so:
Code:
DECLARE
  CommitAbstand INT :=0;
  counter INT := 1;
BEGIN

      FOR counter IN 1..500 -- (Hier würde dann 5.000.000 stehen ;o) )
      LOOP
          INSERT INTO my_stuff (Spaltenname) VALUES  (counter);


            CommitAbstand := CommitAbstand +1;
          IF
                  CommitAbstand = 100
          THEN COMMIT;
                  CommitAbstand :=0;
          END IF;
        END LOOP;
      COMMIT COMMENT 'Auto Commit';

END;
/

Meine Frage ist jetzt ob es nicht sowas wie AUTO_COMMIT gibt und jemand da ein Beispiel für mich hätte wäre echt super. Die oben angegebene Funktion ist schon o.k. aber wahrscheinlich noch nicht so professionel für die Masse der Daten die ich kopieren muß.

Schon jetzt vielen Dank für ne Antwort und noch ein frohes Fest !!
 
Du könntest ein extragrosses Rollbacksegment, z.B. rbs_big mit 20 MB oder mehr, anlegen und speziell dieses für die Transaktion benutzen:

alter rollback segment rbs_big online

set transaction use rollback segment rbs_big

Der Befehl set transaction .... wird unmittelbar vor dem Insert .... eingegeben.

Oder mit einer Procedur wie Du vorgeschlagen hast. Jedoch solltest Du das Commit-Statement nicht zu oft aufrufen, da sonst ein "Schnappschuss zu alt ... " ausgelöst werden könnte bevor der Insert... vollständig ist.
 
Falls das "Tabelle kopieren" wörtlich gemeint ist, kann man das auch mittels export/import erledigen, CREATE TABLE targetTable AS SELECT * FROM sourceTable täte das auch oder, wenn Du an den Werten irgendwas ändern mußt, erzeuge ein SQL loader file und pack das damit in die Datenbank.
 
Hallo!

Ein weiterer Tip wäre es beispielsweise alle Indizes/ Trigger etc. von der Zieltabelle vor dem kopieren zu droppen/disablen. Damit sollte der import ein wenig flotter ablaufen. Nach erfolgreichem kopieren kannst du dann die einzelnen Features nach und nach wieder aktivieren.

Gruß Tom
 
Zurück