Aktualisierung 1 Millionen Datensätze in oracle-DB als batch-10k;
Ich das update einer Tabelle in oracle db-batch-10k.
Habe ich versucht, dieses:
BEGIN
WHILE (true) LOOP
UPDATE TOP (10000) CUSTOMERS SET ACTIVE = 'N' WHERE ACTIVE='Y';
IF sql%notfound THEN
EXIT;
END IF;
COMMIT;
END LOOP;
END;
Es funktioniert nicht als plsql nicht unterstützt top.
Irgendwelche Vorschläge?
- Warum müssen es tun, in den Reihen? (Oracle ist durchaus in der Lage zu aktualisieren 1M Datensätze in einer einzigen Anweisung)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre pl/SQL-block, mit JVA ' s Vorschlag, sollte abgeschlossen sein, wie diese (somce Sie sind neu in pl/sql bin ich das hinzufügen einige syntaktische Anregungen, die Sie interessieren könnte):
Nicht in Versuchung zu platzieren "commit" vor dem "exit wenn sql%notfound": nach einem "commit" sql%notfound ist immer false, und die Schleife wäre wirklich endlos.
Lassen Sie mich darauf hinweisen, dass, um effizient zu sein, erfordert dieser Ansatz der "ACTIVE" - Spalte indiziert werden!
wenn Sie nicht über einen index auf die Spalte "aktiv", jedes "update" wird gezwungen sein, neu zu starten, ein full table scan von Anfang an nur um zu finden die nächsten 1000 Datensätze, die noch aktualisiert werden müssen.
Dieser andere Ansatz, den ich dir Vorschlage, verwendet einige fortgeschrittene PL/SQL-Funktionen, die Sie, als ein Lernender, mighy interessiert (rowid, "Tabelle",cursor bulk holt und "füralle") und ist nur ein scan der Tabelle aktualisiert werden, damit (im Falle der Abwesenheit der Indizes) führt es besser als der bisherige Ansatz.
halten Sie im Verstand, wenn Sie über Indizes verfügen, ist dies langsamer (aber mit foralls, bulk sammelt und rowid zugreift, ist es nicht langsamer) , aber es kann nützlich in Fällen, wo die Dinge komplexer sind (zum Beispiel: wenn die where-Bedingung für den Zugriff auf Daten aus anderen Tabellen mit Hilfe von komplexen joins kann nicht schneller gemacht werden). Es gibt Fälle, wenn das "wo" ist so Komplex und langsam, dass Sie wirklich nicht wollen, zu re-führen Sie es über und über mit einer "where rownum<=1000" - Ansatz.
Wenn Sie auto erhöht synthetischen
ID
Spalte aufCUSTOMERS
Tisch, dann können Sie einfach eineWHERE
Zustand sagenHinzufügen oben auf jva ' s Antwort verarbeiten alle Zeilen ohne änderung der Abfrage für jede charge:
Vor-update:
Update:
Ausgabe:
Nach :