Oracle-update-Anweisungen in einem batch-Modus
Muss ich laufen, ein paar relativ einfache SQL-update-Anweisungen zum aktualisieren einer einzelnen Spalte in einer Oracle-Tabelle mit 14,4 Millionen Zeilen. Eine Anweisung führt eine Funktion geschrieben in Java und der JVM läuft out of memory wie mache ich das update auf alle 14,4 Millionen Zeilen.
Haben Sie geschrieben, eine Art batch-PL/SQL-routine, die brechen können diese einfach aktualisieren, in Mengen von, sagen wir, 10K Datensätze pro batch? Ich weiß, dass wenn ich richte meine updates nach einer Reihe von Aufzeichnungen, es wird viel schneller gehen, und ich nicht genügend Arbeitsspeicher zur Verfügung. Ich bin sicher, es gibt eine einfache Möglichkeit, dies zu tun mit einem FOR loop
und row_num
aber ich bin nicht so viel Fortschritt.
Sind hier die beiden Aussagen, die ich ausführen müssen, die für jede charge von n Datensätze:
erste:
update vr_location l set l.usps_address=(
select mylib.string_utils.remove_duplicate_whitespace(
house_number || ' ' || pre_street_direction || ' ' || street_name || ' ' ||
street_description || ' ' || post_street_direction)
from vr_address a where a.address_pk=l.address_pk);
zweite:
update vr_location set usps_address = mylib.usaddress_utils.parse_address(usps_address);
Du musst angemeldet sein, um einen Kommentar abzugeben.
Tun, eine anfängliche wählen Sie zum abrufen einer Art von Gruppierung-Attribut, so dass Sie am Ende mit Gruppen, die die gewünschte Anzahl von Zeilen. Experimentieren Sie mit den grouping Klausel, zum Beispiel die letzten drei Ziffern der zip-code oder etwas, das halb zufällig.
Schleife über die Gruppierung-Klausel unter Verwendung der Klausel als parameter zur Begrenzung der Zeilen gezielt nach jeder update-Anweisung. commit am Ende jeder iteration.
Können Sie (oder Ihr DBA) sollte die Größe der RÜCKGÄNGIG machen und tun dies als eine einzige SQL-Transaktion
Die Vorteile sind:
Wenn Sie in irgendeiner Art der Belastung Umgebung, wo Sie nicht kümmern, entweder von diesen, dann nutzen CTAS ("create table as select), um eine neue Tabelle mit dem geänderten Wert, erstellen Sie die Indizes, constraints, etc. und tauschen Sie die Tabelle Namen. 14 Millionen Zeilen, ist nicht groß in diesen Tagen.
Gut, ich musste Sachen erledigen und so nahm ich Ihren Empfehlungen habe dann ein wenig Python zu tun. Ich landete mit cx_Oracle zu geben mir eine gute Kontrolle über die Transaktionen. Offensichtlich PL/SQL wäre besser gewesen, aber ich weiß es nicht. Python ist meine neue hammer, und alles ist ein Nagel!
Blog-post zum Thema