Ich habe ein Data Warehouse (Oracle), in dem ich eine Spalte für alle 700 Millionen Zeilen auf den gleichen Wert setzen muss.
Ich habe keinen Administratorzugriff oder Zugriff auf einen Administrator, daher muss dies mit einfachem SQL durchgeführt werden und es wird keine temporäre Tabelle erstellt.
Eine weitere Komplikation ist, wenn ich versuche, nur ein einfaches Update mit 1 = 1 durchzuführen, ist der Redo-Platz knapp.
Die Art, wie ich es jetzt laufen habe, ist eine Schleife wie diese:
loop
update mytable set mycolumn = '1' where mycolumn is null and rownum < 50000;
commit;
end loop
aber ich weiß, das ist wahrscheinlich naiv und es muss eine schnellere und elegantere Lösung geben.
oracle
performance
Ich habe es geschafft
quelle
quelle
Antworten:
Wenn Sie über ausreichend Platz verfügen, können Sie CTAS mit minimalem Rückgängigmachen / Wiederherstellen ausführen . Wenn Sie überhaupt Indizes haben, ist eine andere Vorgehensweise sehr langsam und führt zu einer verrückten Protokollierung.
Wenn Sie eine einzelne IOT ohne Sekundärindizes oder einen einzelnen Tabellencluster haben, können Sie die Aktualisierung des Primär- / Clusterschlüssels in Blöcken schrittweise durchführen, ohne die gesamte Tabelle erneut durchsuchen zu müssen, um die noch nicht aktualisierten Felder zu finden.
--bearbeiten
Dann schlage ich vor, die Tabelle in Abschnitte zu unterteilen, um sie mit etwas zu verarbeiten, für das Sie eine Indizierung durchführen (auch wenn es sich um eine einzelne Spalte handelt, können Sie sie in Wertebereiche aufteilen). Auf diese Weise wird für jeden Abschnitt ein FTS einmal ausgeführt, anstatt einmal wie in Ihrem Code. Du wirst mit einer Menge Redo leben müssen und auch deinen Undo-Space löschen müssen (also keine Rückblende danach)
--edit2
Wenn Sie Spalten hinzufügen / umbenennen / löschen können, können Sie dies sehr effizient tun , jedoch nur mit 11 g
quelle
NOLOGGING
zulässt, werden die Hotstandbys ungültig.nologging
ein Werkzeug für Lagerhäusercreate table foo as select * from bar where rownum<100000
)Wenn Sie mit 11g arbeiten, löschen Sie die Spalte und fügen Sie sie als NOT NULL-Spalte mit einem Standardwert hinzu. Dies ist nicht intuitiv, aber Oracle speichert den Standardwert in der Tabellendefinition und ersetzt ihn zur Laufzeit.
quelle