Oracle SQL-insert, große Datensätze effizient über die cursor verwenden und einzelne verpflichten

Den folgenden SQL-erstellt alle übereinstimmenden Datensätze aus zwei Tabellen, die identische schemas und geht dann Durchlaufen Sie den cursor, speichert dieses Ergebnis gesetzt. Ich mache eine Zeilen-insert mit einem commit am Ende dieser Funktion. Meine Frage ist, wie bekomme ich die maximale Leistung aus dieser Art der Abfrage? Code folgt:

BEGIN  
DECLARE    
   CURSOR foo IS  
        SELECT * FROM tableOne to  
        WHERE EXISTS (SELECT * FROM tableTwo tt  
                       WHERE TO.FOO = TT.FOO  
                       AND TO.BAR = TT.BAR);  --THIS TAKES 5 MINUTES (66 MILLION ROWS)
     BEGIN  
           FOR nextFoo IN foo  
     LOOP  
            INSERT INTO tracker t  
               (id,foo,bar,baz)  
            VALUES(trackerSequence.nextval, nextFoo.foo,nextFoo.bar,nextFoo.baz);  
     END LOOP;   
     COMMIT;  
     END;  
END;

Diese Abfrage kann nach oben von einer Stunde, und ich versuche, die Zeit verringern, die damit verbundenen Kosten. Ich werde die Verarbeitung mit 140 Millionen Datensätze im Allgemeinen, so erwarte ich die doppelte Menge, wie lange dieser Prozess dauert. Alle Spalten indiziert sind.

Version Informationen:

10g 10.2

  • :Warum haben Sie nicht versucht, bulk insert?
  • die ersten test-Fälle, die ich geliefert wurde, waren für 10k Datensätze. Ich habe laufen in eine Skala problem Recht deutlich. Bitte postet eine Antwort, die verwendet bulk insert, als wäre das von Vorteil.
  • :Was ist Ihre version von Oracle, die Sie verwenden?
  • Oracle 10g 10.2
InformationsquelleAutor Woot4Moo | 2012-08-01
Schreibe einen Kommentar