Недавно я добавил битовый столбец, поддерживающий NULL, в таблицу, в которой содержится около 500 миллионов строк. В столбце нет значения по умолчанию, однако для всех вставок указано значение 0 или 1, и я выполнил одноразовую процедуру, чтобы присвоить 0 или 1 всем существующим строкам (обновление строк небольшими партиями). Каждая строка должна иметь 0 или 1 в этом столбце.
Я хочу, чтобы битовый столбец не обнулялся, однако, когда я попытался сделать это через ALTER TABLE t1 ALTER COLUMN c1 bit not null
, он начал работать в течение 3 минут, и я остановил его, потому что он блокировал все чтения в таблице, и я подозревал, что это займет много времени, чтобы завершить , Возможно, это не займет много времени, но я не могу рисковать слишком большой недоступностью. Сам откат занял 6 минут.
Есть ли у вас какие-либо предложения о том, как сделать столбец необнуляемым, чтобы он не занял много времени? Кроме того, есть ли способ оценить, сколько времени ALTER TABLE ALTER COLUMN
займет завершение заявления, которое я начал, а затем отменил?
Я использую SQL Server 2017 Web Edition.
источник
SELECT c1, count(*) FROM t1 GROUP BY c1
что заняло около 9 минут. ФактическоеALTER TABLE ALTER COLUMN
утверждение после этого заняло 25 минут. Не так уж плохо.Если вы используете Enterprise Edition (EE), то лучшей стратегией, возможно, было бы добавить ее,
NOT NULL
используя значение по умолчанию0
или1
(в зависимости от того, что является наиболее распространенным).Это изменение метаданных только в EE . Затем обновите те, которые нужно перевернуть. Это означает, что меньше обновлений и нет необходимости изменять обнуляемость столбцов после завершения. - Мартин-Смит
источник
Попробуйте скопировать данные в новую таблицу, затем переименуйте ее. Вы должны позаботиться о любых ограничениях и индексах. Это то, что делает дизайнер таблиц SSMS, когда вы хотите изменить порядок столбцов (например), но вы должны проверить скрипт, чтобы увидеть, есть ли что-то, что выглядит неправильно.
Во время копирования доступ для чтения к исходной таблице не является проблемой, но при наличии любых записей они могут быть заблокированы или не скопированы, в зависимости от уровня изоляции.
источник