Ich möchte die effizienteste Methode zum Aktualisieren jeder Zeile in einer extrem großen Oracle-Tabelle für eine einzelne Spalte kennen. Beispielsweise:
update mytable set mycolumn=null;
oder:
update mytable set mycolumn=42;
Mein Wissen kann sehr gut abgestanden sein. Ich ändere die Tabelle, um die Spalte zu löschen. Anschließend ändere ich die Tabelle, um die Spalte mit dem Standardwert des neuen Werts hinzuzufügen, den ich verwenden möchte. Dann ändere ich die Tabelle, um den Standardwert für die Spalte zu entfernen. Ich finde, dass dies viel schneller ist, als nur ein Update auszuführen, aber ich habe das Gefühl, dass es eine bessere Methode gibt.
Antworten:
Viel hängt von der anderen Aktivität ab, die gegen diese Tabelle ausgeführt wird, während Sie dieses Massenupdate durchführen. Ich hoffe, Sie haben eine Art Testumgebung, in der Sie einige Beispiele für das, was Sie tun möchten, ausführen und eine Vorstellung davon bekommen können, welcher Weg der beste ist. Ich würde versuchen:
update table set column_name = blah
.updating the column=blah
und alle X-Aktualisierungen (möglicherweise 10000) festzuschreiben . Sie können diesen Code parallelisieren, indem Sie ihn kopieren und in einem separaten Abschnitt der Primärschlüssel kopieren.Wir hatten ein sehr ähnliches Problem mit einer Tabelle, die sehr aktiv im OLTP-System verwendet wurde, und wir konnten sie 5x parallelisieren und alle 10000 Zeilen ohne Auswirkung auf die Benutzersperrung auf eine 100+ MM-Zeilentabelle ausführen. Sie haben nicht angegeben, wie Groß ist Ihr Tisch oder welche Art von Anwendung Sie ausführen, aber diese Art von Lösung könnte zu Ihnen passen.
quelle
UPDATE
Stellen Sie sicher, dass Sie für ein schnelles keine Trigger haben, die feuern.Stellen Sie sicher, dass Sie nur diejenigen wieder aktivieren, die Sie möchten, wenn Sie fertig sind.
Möglicherweise fällt auch der Aufwand für die Indexpflege an. Versuchen Sie, Ihre Indizes separat neu zu erstellen. Hierfür ist die Antwort von pappes hilfreich: /programming/129046/disable-and-later-enable-all-table-indexes-in-oracle
Ich wiederhole die Antwort von pappes hier als Referenz. (Beachten Sie, dass dieser SPOOL-Befehl Annahmen über Ihre Plattform und Umgebung macht.)
Importieren ...
quelle
entferne den Index. Aktualisieren Sie die Spalte. Liefert den Index zurück. Wenn die Spalte jedoch denselben Wert für alle Zeilen enthält, können Sie den Index löschen.
quelle
Wenn Sie keine Speicherplatzbeschränkung haben, können Sie eine neue Tabelle erstellen, genauso wie Ihre Tabelle mit der neuen Spalte, die dieser Tabelle hinzugefügt wurde, und die alte Tabelle löschen:
quelle
Probieren Sie mehrere Aktualisierungs- / Festschreibungssequenzen aus. Das Einfügen / Aktualisieren / Löschen zu vieler Zeilen ohne Festschreibung führt zu einer hohen E / A-Belastung. Es kann ziemlich optimiert werden, wenn man Blockgrößen, Datensatzgrößen und so weiter kennt.
Zum Löschen ganzer Daten in einer Tabelle
truncate table x
ist besser alsdelete from x
. Auch das Löschen führt zu einer anderen Prozessauslastung.Bearbeiten: Sie können die
inmemory
Option verwenden, um die Tabelle in den Speicher im Spaltenformat zu laden und dann das Update durchzuführen. es hängt wirklich von den Beziehungen und der Struktur Ihrer DB ab. Siehe diesen Artikel .quelle
truncate
oder wie ichdelete
helfen könnte.