У меня есть таблица в SQL Server 2008 R2 с близким к миллиарду строк. Я хочу изменить тип данных из двух столбцов от int до bigint. Два раза ALTER TABLE zzz ALTER COLUMN yyy
работает, но он очень медленный. Как я могу ускорить процесс? Я подумывал скопировать данные в другую таблицу, отбросить, создать, скопировать обратно и перейти в простой режим восстановления или каким-то образом сделать это с помощью курсора 1000 строк, но я не уверен, что это действительно приведет к каким-либо улучшениям.
Изменение типов столбцов в огромной таблице
Ответ 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. Опять же, я не тестировал, будет ли это делать изменения быстрее или медленнее, или сколько еще потребуется, чтобы добавить сжатие в первую очередь. Просто выбросьте его там.
Ответ 2
Если вы используете что-то вроде SQL Server Management Studio, вы просто переходите к таблице в базе данных, щелкните правой кнопкой мыши, выберите "Дизайн", а затем выберите столбец, который вы хотите изменить: установите его в bigint и нажмите "Сохранить". Изменяет весь столбец, но прежние значения останутся такими, какими они есть. Это полезно для того, чтобы таблица могла "вырасти из" int в bigint, но не изменит существующие данные, насколько я знаю.