Я собираюсь предположить, что вы приближаетесь к пределу в 2,1 миллиарда для типа данных INT для искусственного ключа для столбца. Да, это боль. Гораздо проще исправить до факта, чем после того, как вы действительно достигнете этого предела, и производство будет остановлено, пока вы пытаетесь это исправить:)
Во всяком случае, некоторые идеи здесь будут работать. Давайте поговорим о скорости, эффективности, показателях и размере логов.
Рост журнала
Изначально журнал взорвался, потому что он пытался зафиксировать все строки 2b одновременно. Подсказки в других постах для "разбивки на части" будут работать, , но , которые могут не полностью решить проблему журнала.
Если база данных находится в режиме SIMPLE, все будет в порядке (журнал будет повторно использоваться после каждой партии). Если база данных находится в режиме восстановления FULL или BULK_LOGGED, вам придется часто запускать резервные копии журналов во время выполнения вашей операции, чтобы SQL мог повторно использовать пространство журнала. Это может означать увеличение частоты резервного копирования в течение этого времени или просто мониторинг использования журнала во время работы.
Индексы и скорость
ВСЕ из ответов where bigid is null
будут замедляться при заполнении таблицы, поскольку в новом поле BIGID (предположительно) нет индекса. Вы могли бы (конечно) просто добавить индекс на BIGID, но я не уверен, что это правильный ответ.
Ключ (предназначен для каламбура) - это мое предположение, что исходное поле идентификатора, вероятно, является первичным ключом, или кластеризованным индексом, или обоими. В этом случае, давайте воспользуемся этим фактом и сделаем вариацию идеи Джесса:
set @counter = 1
while @counter < 2000000000 --or whatever
begin
update test_table set bigid = id
where id between @counter and (@counter + 499999) --BETWEEN is inclusive
set @counter = @counter + 500000
end
Это должно быть очень быстро из-за существующих индексов по ID.
Проверка ISNULL на самом деле не нужна, равно как и мой (-1) на интервале. Если мы дублируем несколько строк между вызовами, это не имеет большого значения.