SQL Alter Table для добавления столбца, это делает что-нибудь "страшное"? - PullRequest
1 голос
/ 11 июня 2010

Мне нужно добавить столбец к существующей таблице в моей живой базе данных sql. Я знаю, как использовать команду ALTER, но я хочу знать, как это влияет на таблицу.

Например, если вы используете SQL Management Studio, он утверждает, что добавление столбца приведет к «удалению и повторному созданию» таблицы.

Будет ли это делать и команда таблицы ALTER?

Доступ к этой таблице ПОСТОЯННО и ОЧЕНЬ важен, поэтому я хочу ОЧЕНЬ убедиться в этом, прежде чем идти вперед.

Ответы [ 6 ]

7 голосов
/ 11 июня 2010

Нет, ALTER TABLE x ADD y не будет воссоздавать таблицу, он просто добавит столбец.Единственная проблема, с которой вы можете столкнуться, - это если столбец должен быть NOT NULL.В этом случае команда завершится с ошибкой, если вы не укажете значение по умолчанию (если в этой таблице уже есть строки).Это потому, что нужно знать, что заполнять существующим строкам.

5 голосов
/ 11 июня 2010

Под «постоянным доступом» вы подразумеваете «у меня нет времени простоя или технического обслуживания, в котором можно внести критические изменения в базу данных»?Если так, то , что - страшная часть.Как все говорят, это обновление потребует эксклюзивной блокировки таблицы, и если ему придется ждать этой блокировки, вы можете получить блокировку, тайм-ауты и возможное раздражение пользователей.

Слишком новый столбец может потребоватьОбновление таблицы.Я не на 100% уверен в том, что здесь происходит, но если (это пример «что если», но это может произойти), вы добавляете столбец char (100) к таблице из 10000 строк, в которой только что был кластеризованный индексперестроен с fillfactor = 0, затем вы добавляете 100 байт на строку на страницы, которые уже заполнены, и куда эти данные попадают?Либо вы получаете разделение страниц или переадресованные записи, и для создания SQL потребуется и то, и другое, то есть длинные блоки и дополнительные задержки для доступа к запросам к таблице.

Серьезно, попробуйте найти время простоя илипо крайней мере, в малом объеме времени (воскресенье 2 утра?), чтобы сделать работу, как это.И проверьте это, если можете ... но очень немногие места имеют сайты тестирования, которые подражают серьезно занятым производственным веб-сайтам.Если ничто иное, проверка копии вашей БД покажет примерно, сколько времени это займет, если вы можете получить окно простоя.

1 голос
/ 11 июня 2010

(Отказ от ответственности: ответ на основе общего опыта SQL, не относится к MS SQL Server)

Попробуйте сначала, в менее критичной базе данных.

Впо крайней мере, вероятно, потребуется блокировка таблицы, которая заблокирует доступ на время изменения.Это может занять от нескольких миллисекунд до минуты или более в зависимости от размера таблицы и нагрузки на сервер.

Команда ALTER, которая добавляет только столбец , не должна удалять все существующиеинформация.

0 голосов
/ 11 июня 2010

Зависит от того, как ваш движок базы данных выкладывает файлы. «Страшного» поведения можно избежать, если:

  1. Возможно добавить NULL в конец каждой строки без фактического добавления байтов в строку, или
  2. В каждом ряду достаточно места для расширения.

В SQLite , например, ADD COLUMN всегда является операцией O (1).

MS SQL Server не имеет свойства (1) и может потребовать разбиения страницы, если свойство (2) имеет значение false.

0 голосов
/ 11 июня 2010

Посмотрите на сценарий, который он генерирует.

Если вы попытались вставить столбец в графический интерфейс, это перезапишет таблицу.

Добавление столбца в конце не будет.

0 голосов
/ 11 июня 2010

Если он делает что-то «страшное», это может быть только ошибкой в ​​коде вашего сервера базы данных.

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

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