Чтобы добавить столбец NOT NULL в таблицу со многими записями, необходимо применить ограничение DEFAULT. Это ограничение заставляет всю команду ALTER TABLE занять много времени, если таблица очень велика. Это происходит потому, что:
Предположения:
- Ограничение DEFAULT изменяет существующие записи. Это означает, что db необходимо увеличить размер каждой записи, что заставляет ее перемещать записи на полные страницы данных на другие страницы данных и требует времени.
- Обновление DEFAULT выполняется как атомная транзакция. Это означает, что журнал транзакций нужно будет вырастить, чтобы при необходимости можно было выполнить откат.
- Журнал транзакций отслеживает всю запись. Поэтому, хотя изменяется только одно поле, пространство, необходимое журналу, будет основываться на размере всей записи, умноженной на # существующих записей. Это означает, что добавление столбца в таблицу с небольшими записями будет быстрее, чем добавление столбца в таблицу с большими записями, даже если общее количество записей одинаково для обеих таблиц.
Возможные решения:
- Подсоедините его и дождитесь завершения процесса. Просто убедитесь, что период таймаута очень длинный. Проблема заключается в том, что в зависимости от количества записей может потребоваться несколько часов или дней.
- Добавьте столбец, но разрешите NULL. Затем запустите запрос UPDATE, чтобы установить значение DEFAULT для существующих строк. Не делайте ОБНОВЛЕНИЕ *. Обновляйте партии записей за раз, или у вас будет та же проблема, что и решение # 1. Проблема с этим подходом заключается в том, что вы получаете столбец, который позволяет NULL, когда вы знаете, что это лишний вариант. Я считаю, что есть некоторые документы лучшей практики, в которых говорится, что у вас не должно быть столбцов, которые разрешают NULL, если это не необходимо.
- Создайте новую таблицу с той же схемой. Добавьте столбец в эту схему. Перенесите данные из исходной таблицы. Отбросьте исходную таблицу и переименуйте новую таблицу. Я не уверен, что это лучше, чем # 1.
Вопросы:
- Правильно ли мои предположения?
- Являются ли эти мои единственные решения? Если да, то какой из них лучше? Я не знаю, что еще я мог сделать?