У меня нет «лучшего» ответа, но у меня есть «наименее плохой» ответ, который может позволить вам сделать все достаточно быстро.
Моя таблица имела 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 на него; Я хотел избежать переключения FOREIGN KEYS на очень многих столах. И тогда есть взгляды.
Немного поиска документов, тематических исследований и StackOverflow, и у меня было "A-Ha!" момент. Утечка была не в основном UPDATE, а во всех операциях INDEX. В моей таблице было 12 индексов - несколько для уникальных ограничений, несколько для ускорения планировщика запросов и несколько для полнотекстового поиска.
Каждая строка, которая была ОБНОВЛЕНА, не только работала над DELETE / INSERT, но также и накладными расходами на изменение каждого индекса и проверку ограничений.
Мое решение состояло в том, чтобы удалить все индексы и ограничения, обновить таблицу, а затем добавить все индексы / ограничения обратно.
Потребовалось около 3 минут, чтобы написать транзакцию SQL, которая сделала следующее:
- НАЧАТЬ;
- пропущенные индексы / содержания
- обновить таблицу
- повторно добавить индексы / ограничения
- COMMIT;
Выполнение сценария заняло 7 минут.
Принятый ответ определенно лучше и правильнее ... и практически исключает необходимость простоев. В моем случае, однако, потребовалось бы значительно больше работы «Разработчика», чтобы использовать это решение, и у нас было 30-минутное окно запланированного простоя, в котором оно могло бы быть достигнуто. Наше решение решило эту проблему в 10.
ALTER TABLE .. ADD COLUMN ...
или на эту часть тоже нужно ответить?