Oracle SQL insert grand ensemble de données de manière efficace par l'utilisation du curseur et commit unique

Le SQL suivant génère tous les enregistrements correspondants entre deux tables qui ont les mêmes schémas et procède ensuite à effectuer une itération sur le curseur qui stocke l'ensemble de résultats. - Je faire ligne par ligne insérer une validation à la fin de cette fonction. Ma question est comment puis-je obtenir le maximum de performance de ce type de requête? Code suit:

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;

Cette requête peut prendre jusqu'à une heure et je suis en train de réduire le coût lié à elle. Je vais être le traitement de 140 millions d'enregistrements en général, donc je m'attends à le double de la quantité de temps cela prend. Toutes les colonnes sont indexées.

Informations de Version:

10g 10.2

  • :Pourquoi vous n'avez pas essayé d'insertion en bloc?
  • la première des cas de test, j'ai été fournis avec, pour les 10k enregistrements. J'ai couru dans un problème d'échelle tout à fait clairement. Merci de poster une réponse qui utilise bulk insert que cela serait bénéfique.
  • :Quelle est votre version d'Oracle que vous utilisez?
  • Oracle 10g 10.2
InformationsquelleAutor Woot4Moo | 2012-08-01