Я не маю "найкращої" відповіді, але у мене є "найменш погана" відповідь, яка може дати вам можливість зробити справи досить швидко.
У моїй таблиці були рядки 2ММ, і продуктивність оновлення змінювалася, коли я намагався додати стовпчик вторинної часової позначки, який за замовчуванням став першим.
ALTER TABLE mytable ADD new_timestamp TIMESTAMP ;
UPDATE mytable SET new_timestamp = old_timestamp ;
ALTER TABLE mytable ALTER new_timestamp SET NOT NULL ;
Після того, як воно зависло 40 хвилин, я спробував це на невеликій партії, щоб зрозуміти, як довго це може зайняти - прогноз був близько 8 годин.
Прийнята відповідь, безумовно, краща - але ця таблиця широко використовується в моїй базі даних. Є кілька десятків таблиць, які FKEY на нього; Я хотів уникнути перемикання зовнішніх ключів на стільки таблиць. А далі є погляди.
Трохи пошуків документів, тематичних досліджень та StackOverflow, і у мене було "A-Ha!" мить. Слив був не в основній ОНОВЛЕННІ, а в усіх операціях INDEX. У моїй таблиці було 12 індексів - кілька для унікальних обмежень, кілька для прискорення планування запитів і кілька для повнотекстового пошуку.
Кожен рядок, який було ОНОВЛЕНО, не працював лише на DELETE / INSERT, але й накладні зміни змін кожного індексу та перевірки обмежень.
Моє рішення полягало в тому, щоб скинути кожен індекс і обмеження, оновити таблицю, а потім додати всі індекси / обмеження.
На написання транзакції SQL знадобилося близько 3 хвилин, яка зробила наступне:
- ПОЧАТОК;
- впали індекси / складові
- оновлення таблиці
- повторно додавати індекси / обмеження
- КОМІТЕТ;
Сценарій зайняв 7 хвилин.
Прийнята відповідь, безумовно, краща і правильніша ... і практично виключає потребу в простоях. У моєму випадку, для використання цього рішення знадобилося б значно більше роботи "розробника", і у нас було 30-хвилинне вікно запланованого простою, в якому воно могло бути виконане. Наше рішення вирішило це в 10.
ALTER TABLE .. ADD COLUMN ...
чи це відповідь також?