Nie mam „najlepszej” odpowiedzi, ale mam „najmniej złą” odpowiedź, która może pozwolić ci zrobić wszystko dość szybko.
Moja tabela miała 2MM wiersze, a wydajność aktualizacji była chugująca, gdy próbowałem dodać dodatkową kolumnę znacznika czasu, która domyślnie była ustawiona na pierwszą.
ALTER TABLE mytable ADD new_timestamp TIMESTAMP ;
UPDATE mytable SET new_timestamp = old_timestamp ;
ALTER TABLE mytable ALTER new_timestamp SET NOT NULL ;
Po zawieszeniu przez 40 minut spróbowałem tego na małej partii, aby dowiedzieć się, ile to może potrwać - prognoza wynosiła około 8 godzin.
Akceptowana odpowiedź jest zdecydowanie lepsza - ale ta tabela jest bardzo używana w mojej bazie danych. Jest tam kilkadziesiąt tabel, które FKEY na nim; Chciałem uniknąć przełączania KLUCZY ZAGRANICZNYCH na tak wielu stołach. A potem są poglądy.
Trochę przeszukiwania dokumentów, studiów przypadków i StackOverflow, a ja miałem „A-Ha!” za chwilę. Odpływ nie dotyczył podstawowej aktualizacji, ale wszystkich operacji INDEX. Moja tabela miała 12 indeksów - kilka dla unikalnych ograniczeń, kilka dla przyspieszenia planowania zapytań i kilka dla wyszukiwania pełnotekstowego.
Każdy wiersz, który został zaktualizowany, nie tylko działał na DELETE / INSERT, ale także narzut związany ze zmianą każdego indeksu i sprawdzaniem ograniczeń.
Moim rozwiązaniem było usunięcie każdego indeksu i ograniczenia, zaktualizowanie tabeli, a następnie dodanie wszystkich indeksów / ograniczeń z powrotem.
Napisanie transakcji SQL, która wykonała następujące czynności, zajęło około 3 minut:
- ZACZYNAĆ;
- porzucone indeksy / constaints
- aktualizacja tabeli
- ponownie dodaj indeksy / ograniczenia
- POPEŁNIĆ;
Uruchomienie skryptu zajęło 7 minut.
Przyjęta odpowiedź jest zdecydowanie lepsza i bardziej właściwa ... i praktycznie eliminuje potrzebę przestojów. W moim przypadku użycie tego rozwiązania wymagałoby znacznie więcej pracy „programisty”, a my mieliśmy 30-minutowy okres planowego przestoju, w którym można go zrealizować. Nasze rozwiązanie rozwiązało to w 10.
ALTER TABLE .. ADD COLUMN ...
czy też na tę część należy odpowiedzieć?