2016-06-08 16 views
-1

Ich versuche, 5 Millionen Zeilen zu aktualisieren. Die folgende Abfrage wird in 5-6 Minuten ausgeführt. Aber ich möchte periodische Commits zwischen 500000 Datensätzen haben. Wie mache ich das?Update Millionen von Zeilen in Orakel

Jede Hilfe wird geschätzt.

Dank

DECLARE 
    a NUMBER; 
    BEGIN 
    UPDATE table1 
    SET (name) = 
     (SELECT name 
      FROM table1 
      WHERE  a1= 24672 

    WHERE ROWNUM <= 6500000; 

    a := SQL%ROWCOUNT; 
    DBMS_OUTPUT.put_line (a || ' Rows Updated'); 
END; 
/
+0

es ist nur ein Name ändern so auch wenn es einen Fehler wirft, nach 5 Millionen wäre das in Ordnung mit mir. – Amir

Antwort

0

Sie wahrscheinlich etwas ähnliches wie dies tun könnte.

DECLARE 
    a NUMBER; 
    commitCt NUMBER; 
    rowCt NUMBER; 

    BEGIN 
     LOOP 
     commitCt := 0; 
     rowCt := 0; 
     SAVEPOINT svePoint; 

    WHILE rowCt/500000 <= 1 
    LOOP 
     BEGIN 
      rowCt := rowCt + 1; 



      commitCt := commitCt + 1; 

     EXCEPTION 
     WHEN OTHERS THEN 
      ROLLBACK to svePoint; 
     END; 

     END LOOP; 

    COMMIT; 

    IF commitCt = 0 THEN 
     EXIT; 
    END IF; 

     END LOOP; 
END; 
/
0

Da Sie diese "Optimierung" markiert haben, nehme ich an, dass Sie sich um Leistung kümmern. Während Sie Ihre SQL in PL/SQL umschreiben können, verwenden Sie eine Schleife und commit alle n Iterationen, das wird Sie verlangsamen.

Der schnellste Weg, Millionen von Zeilen zu aktualisieren, ist oft tatsächlich nicht zu aktualisieren. Stattdessen erstellen Sie eine neue Tabelle (CREATE TABLE ... AS ... SELECT), löschen Sie Ihre alte Tabelle und benennen Sie dann Ihre neue Tabelle um. Es reduziert die Anzahl der Wiederholungen und rückgängig macht und beschleunigt die Leistung erheblich.

Siehe How to update millions of rows

Wenn die Leistung dann gut genug ist, dass Sie möglicherweise nicht mehr über Teil-Commits kümmern?

Verwandte Themen