Прерывает ли ALTER TABLE ALTER COLUMN текущий доступ к БД? - PullRequest
2 голосов
/ 12 октября 2011

У меня есть столбец в таблице, так что это уже не NVARCHAR (256), а NVARCHAR (MAX). Я знаю команду для этого (ALTER TABLE ALTER COLUMN NVARCHAR (MAX)). Мой вопрос действительно о разрушении. Я должен сделать это в производственной среде, и мне было интересно, есть ли вероятность того, что, пока я выполняю это в реальной среде, может произойти нарушение работы пользователей. Будут ли загружены пользователи, которые используют базу данных в то время? Эта операция, вероятно, займет слишком много времени?

Спасибо

Сэчины

Ответы [ 4 ]

3 голосов
/ 12 октября 2011

Я удалил свой предыдущий ответ, в котором утверждалось, что это будет изменение только метаданных, и отправляю новый с совершенно другим выводом!

Хотя это верно для изменения до nvarchar(4000)в случае изменения на nvarchar(max) операция кажется чрезвычайно дорогой.SQL Server добавит новый столбец переменной длины и скопирует ранее существующие данные, что, вероятно, будет означать трудоемкую операцию блокировки, приводящую к многочисленным разбиениям страниц и как внутренней, так и логической фрагментации.

Это видно из приведенного ниже

CREATE TABLE T
(
Foo int IDENTITY(1,1) primary key,
Bar NVARCHAR(256) NULL
)

INSERT INTO T (Bar)
SELECT TOP 4 REPLICATE(CHAR(64 + ROW_NUMBER() OVER (ORDER BY (SELECT 0))),50)
FROM sys.objects

ALTER TABLE T ALTER COLUMN Bar NVARCHAR(MAX) NULL

Затем, просматривая страницу в средстве просмотра SQL Server, вы увидите:

Screenshot

Белый 41 00 ... - пустое пространство из предыдущей версии столбца.

2 голосов
/ 12 октября 2011

Все текущие запросы не будут затронуты. База данных должна подождать, пока она не сможет установить эксклюзивную блокировку таблицы, прежде чем ее можно будет изменить.

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

0 голосов
/ 12 октября 2011

Все должно быть хорошо, если у вас нет большого количества строк (миллионов). Да, он будет блокировать таблицу во время ее обновления, но ожидающие запросы просто будут ждать ее.

0 голосов
/ 12 октября 2011

Совет должен быть - сделайте резервную копию и сделайте это в нерабочее время, если можете.

С учетом вышесказанного я не ожидаю, что изменение вашей базы данных будет нарушено, и это не займет много времени.

А как насчет вашего клиентского программного обеспечения? Как это повлияет?

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