Изменение типов столбцов в огромной таблице

У меня есть таблица в 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, но не изменит существующие данные, насколько я знаю.