Какой самый эффективный способ изменить определение столбца в таблице с миллионами строк

9

Мне нужно изменить столбец с NOT NULL на NULL в таблице, содержащей миллионы строк. Я попробовал простой

alter table Table1 ALTER COLUMN Column1 XML NULL

но это занимает вечность. Итак, вот мои вопросы:

  1. Почему это так долго, чтобы применить альтер?
  2. Есть ли лучший способ сделать это?
Йонас Ставски
источник

Ответы:

3

1) Требуется больше информации о полной структуре таблицы + некластеризованные индексы, чтобы правильно выяснить, что происходит, но я подозреваю, что это связано с битовой картой NULL.

Пожалуйста, обратитесь к более подробной информации по теме. http://www.sqlskills.com/BLOGS/PAUL/post/Misconceptions-around-null-bitmap-size.aspx

http://www.sqlskills.com/BLOGS/PAUL/post/A-SQL-Server-DBA-myth-a-day-(630)-three-null-bitmap-myths.aspx

2) Да, при условии, что у вас есть место для хранения, создайте новую таблицу с правильной обнуляемостью и перенесите данные в несколько пакетов, чтобы избежать чрезмерного увеличения журнала и переключите таблицу, используя методику, перечисленную ниже. Я делал это несколько раз, практически без простоев.

http://jahaines.blogspot.com/2009/12/sql-server-2005-how-to-move-10-millions.html

Санкар Редди
источник
6

Было бы быстрее:

  1. Создайте новую таблицу с правильным определением для Column1
  2. INSERT INTO <NewTable> SELECT * FROM <OriginalTable>;
  3. Переименовать OriginalTable в OriginalTable_old; Переименовать NewTable в OriginalTable
  4. Подтвердить и удалить OriginalTable_old

Преимущество здесь в том, что вы не удерживаете блокировку на Исходном столе в течение всей операции. Таблица должна быть заблокирована только на этапе переименования. (Предполагается, что SQL Server поддерживает переименование на уровне объектов.)

RobPaller
источник
Да, SQL Server поддерживает переименования на уровне объектов с использованием системной хранимой процедуры sp_rename.
Гонсалу
Таким образом я смог изменить столбец с 3,5 млн строк в течение 1 минуты.
Мохсен Афшин
2

Каждая строка должна быть затронута при изменении столбца с NOT NULL на NULL, поэтому для ее завершения требуется так много времени. Нет никакого способа сделать так, чтобы это заняло меньше времени.

mrdenny
источник
1

Другой вариант - создать новый столбец с правильным определением для рассматриваемой таблицы, обновить столбец данными из старого столбца, а затем удалить старый столбец.

Или Вы можете обратиться к более старому сообщению от SE, которое рассматривает подобную проблему в столбце INT.

/programming/4311559/sql-server-performance-for-alter-table-alter-column-change-data-type

yrushka
источник
В моем случае мой столбец просто полон NULL, поэтому я думаю, что это будет путь, создание нового столбца с полным NULL с правильным именем не должно занимать время совсем ... затем удаление старого столбца, вместо того, чтобы иметь дело с миллионами вставок ...
Зак
0

Если вы откроете монитор активности SQL во время выполнения команды, вы сможете узнать, действительно ли он его обрабатывает или ожидает какой-либо формы монопольной блокировки таблицы.

Мэтью Стиплз
источник