Ответ 1
В зависимости от того, какое изменение вы делаете, иногда проще снять окно обслуживания. Во время этого окна (где никто не может изменять данные в таблице), вы можете:
- удалить любые индексы/ограничения, указывающие на старый столбец, и отключить триггеры
- добавьте новый столбец с нулевым значением с новым типом данных (даже если он должен быть NOT NULL)
- обновите новый столбец, установив его равным старому значению столбца (и вы можете сделать это в кусках отдельных транзакций (скажем, затрагивая 10000 строк за раз с помощью
UPDATE TOP (10000) ... SET newcol = oldcol WHERE newcol IS NULL
) и с помощью CHECKPOINT, чтобы избежать обхода вашего журнала) - Как только все обновления будут выполнены, отбросьте старый столбец
- переименуйте новый столбец (и при необходимости добавьте ограничение NOT NULL)
- перестроить индексы и статистику обновлений
Ключевым моментом здесь является то, что он позволяет выполнять обновление поэтапно на шаге 3, что вы не можете сделать в одной команде ALTER TABLE.
Предполагается, что столбец не играет важной роли в целостности данных - если он задействован в связке внешних ключей, есть еще несколько шагов.
ИЗМЕНИТЬ
Кроме того, и просто интересно вслух, я не проводил никаких испытаний для этого (но добавляю его в список). Интересно, поможет ли сжатие страницы + строк? Если вы измените INT на BIGINT, при сжатии на месте SQL Server все равно будет обрабатывать все значения, как если бы они по-прежнему соответствовали INT. Опять же, я не тестировал, будет ли это делать изменения быстрее или медленнее, или сколько еще потребуется, чтобы добавить сжатие в первую очередь. Просто выбросьте его там.