Преобразование первичного ключа int в bigint в Sql Server - PullRequest
10 голосов
/ 28 марта 2011

У нас есть производственная таблица с 770 миллионами строк и изменений.Мы хотим (/ нужно?) Изменить столбец Primary ID с int на bigint, чтобы учесть будущий рост (и избежать внезапной остановки при исчерпании 32-битного целочисленного пространства)

Эксперименты в DEV показали, что этоэто не так просто, как изменить столбец, как нам нужно было бы удалить индекс, а затем создать его заново.Пока что в DEV (который немного скромнее, чем в PROD) падение индекса не закончилось через полтора часа.Эта таблица работает 24 часа в сутки, 7 дней в неделю, и она недоступна в течение длительного времени.

Кто-нибудь еще сталкивался с подобной ситуацией?Как вы это сделали?

Есть ли альтернативы?

Редактировать: Дополнительная информация:

  • Первичный ключ кластеризован.

Ответы [ 3 ]

12 голосов
/ 28 марта 2011

Вы можете попробовать поэтапный подход.

  1. Создать новый столбец bigint
  2. Создать триггер вставки для синхронизации новых записей с 2 ​​столбцами
  3. Выполнить обновление, чтобы заполнить все пустые значения в столбце bigint преобразованным значением
  4. Измените первичный индекс в таблице со старого столбца идентификатора на новый
  5. Укажите любые FK и запросы, чтобы использовать новый столбец
  6. Измените новый столбец, чтобы он стал вашим столбцом идентификаторов, и удалите триггер вставки из # 2
  7. Удалить старый идентификатор столбца

Вы должны в конечном итоге распространить боль по этим 7 ступеням, вместо того, чтобы поразить все сразу.

1 голос
/ 28 марта 2011

Создать параллельную таблицу с более длинным типом данных для новых строк и объединить результаты?

0 голосов
/ 26 сентября 2012

Мне нужно было скопировать данные в новую таблицу с нужной структурой (только первичный / кластерный ключ, некластеризованный / FK после завершения).Если у вас нет комнаты, вы можете скопировать данные и вернуться обратно. Вам может потребоваться отключение приложения, чтобы это произошло.

Что не работает: изменить таблицу Orderhistory изменить идентификатор столбца bigint, потому чтопервичного ключа.Не отбрасывайте ключ и изменяйте столбец, так как вы просто заполните файл журнала и займет гораздо больше времени, чем copy / bcp.

Никогда не используйте конструктор инструментов SSMS для изменения свойства столбца, он копирует таблицу во временную таблицузатем делает переименование после того, как сделано.Найдите синтаксис alter table alter column и используйте его и, возможно, выполните дефрагментацию после завершения, если вы изменили более широкий столбец, расположенный в середине таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...