Ich habe keine "beste" Antwort, aber ich habe eine "am wenigsten schlechte" Antwort, mit der Sie die Dinge einigermaßen schnell erledigen können.
Meine Tabelle hatte 2-MM-Zeilen und die Aktualisierungsleistung war fehlerhaft, als ich versuchte, eine sekundäre Zeitstempelspalte hinzuzufügen, die standardmäßig der ersten entspricht.
ALTER TABLE mytable ADD new_timestamp TIMESTAMP ;
UPDATE mytable SET new_timestamp = old_timestamp ;
ALTER TABLE mytable ALTER new_timestamp SET NOT NULL ;
Nachdem es 40 Minuten lang hängen geblieben war, versuchte ich es mit einer kleinen Menge, um eine Vorstellung davon zu bekommen, wie lange dies dauern könnte - die Prognose lag bei ungefähr 8 Stunden.
Die akzeptierte Antwort ist definitiv besser - aber diese Tabelle wird in meiner Datenbank häufig verwendet. Es gibt ein paar Dutzend Tische, die darauf FKEY; Ich wollte vermeiden, FOREIGN KEYS an so vielen Tabellen zu wechseln. Und dann gibt es Ansichten.
Ein bisschen nach Dokumenten, Fallstudien und StackOverflow suchen, und ich hatte das "A-Ha!" Moment. Der Drain lag nicht auf dem Kern-UPDATE, sondern auf allen INDEX-Operationen. Meine Tabelle enthielt 12 Indizes - einige für eindeutige Einschränkungen, einige für die Beschleunigung des Abfrageplaners und einige für die Volltextsuche.
Jede Zeile, die AKTUALISIERT wurde, arbeitete nicht nur an einem DELETE / INSERT, sondern auch an dem Aufwand, die einzelnen Indizes zu ändern und Einschränkungen zu überprüfen.
Meine Lösung bestand darin, jeden Index und jede Einschränkung zu löschen, die Tabelle zu aktualisieren und dann alle Indizes / Einschränkungen wieder hinzuzufügen.
Es dauerte ungefähr 3 Minuten, um eine SQL-Transaktion zu schreiben, die Folgendes ausführte:
- START;
- gelöschte Indizes / Konstanten
- Tabelle aktualisieren
- Fügen Sie Indizes / Einschränkungen erneut hinzu
- VERPFLICHTEN;
Die Ausführung des Skripts dauerte 7 Minuten.
Die akzeptierte Antwort ist definitiv besser und richtiger ... und macht Ausfallzeiten praktisch überflüssig. In meinem Fall hätte die Verwendung dieser Lösung erheblich mehr "Entwicklerarbeit" in Anspruch genommen, und wir hatten ein 30-minütiges Zeitfenster für geplante Ausfallzeiten, in dem dies möglich war. Unsere Lösung hat sich in 10 Minuten damit befasst.
ALTER TABLE .. ADD COLUMN ...
oder soll dieser Teil auch beantwortet werden?