Добавляет ли столбец блокировку таблицы в SQL Server 2008? - PullRequest
3 голосов
/ 20 июля 2011

Я хочу запустить следующее на таблице из примерно 12 миллионов записей.

ALTER TABLE t1
ADD c1 int NULL;
ALTER TABLE t2
ADD c2 bit NOT NULL
DEFAULT(0);

Я сделал это в стадии подготовки, и время показалось хорошим, но прежде чем я сделал это в производстве, я хотелзнать, как работает блокировка таблицы при создании нового столбца (особенно, если задано значение по умолчанию).Так кто-нибудь знает?Блокируется ли вся таблица или строки блокируются одна за другой при вставке значений по умолчанию?Или вообще что-то другое происходит?

Ответы [ 4 ]

9 голосов
/ 21 июля 2011

До SQL Server 11 (Denali) столбец добавления ненулевого значения по умолчанию будет запускать обновление за кулисами, чтобы заполнить новые значения по умолчанию.Таким образом, будет заблокирована таблица на время обновления 12 миллионов строк.В SQL Server 11 это больше не так, столбец добавляется в оперативном режиме и обновление не происходит, см. Оперативное значение, отличное от NULL, со столбцом значений, добавленным в SQL Server 11 .

Оба в SQLСервер 11 и ранее блокировка Sch-M приобретается для таблицы, чтобы изменить определение (добавить новые метаданные столбца).Эта блокировка несовместима с любым другим возможным доступом (включая грязное чтение).Разница заключается в продолжительности: до SQL Server 11 эта блокировка сохранялась для операции с размером данных (обновление 12M строк).В SQL Server 11 блокировка удерживается только на короткое время.В обновлении строк до SQL Server 11 блокировка строк не требовалась, поскольку блокировка Sch-M для таблицы гарантирует, что не может быть никакого конфликта ни в одной отдельной строке.

5 голосов
/ 21 июля 2011

Да, он заблокируется.

Операторы DDL выдают блокировку схемы (см. Эту ссылку) , которая запрещает доступ к таблице до завершения операции.

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

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

5 голосов
/ 21 июля 2011

Да, таблица будет заблокирована.

Таблица в целом имеет одну схему (набор столбцов со связанными типами).Итак, как минимум , для обновления определения таблицы потребуется блокировка схемы.


Попробуйте подумать о том, как все будет работать наоборот - если бы каждая строка была обновленаиндивидуально, как будут работать любые параллельные запросы (особенно если они включают новые столбцы)?


И значения по умолчанию полезны только во время операторов INSERT и DDL - поэтому, если вы задаете новое значение по умолчанию для 10 000 000строк, это значение по умолчанию должно применяться ко всем этим строкам.

0 голосов
/ 21 июля 2011

Я не читал, как работает механизм блокировки при добавлении столбца, но я почти на 100% уверен, что строка за строкой невозможна.

Наблюдайте, когда вы делаете подобные вещи в SQL Server Manager с помощью перетаскивания (я знаю, что вы не делаете этого здесь, но это общедоступный форум), так как некоторые изменения разрушительны (к счастью, SQL Server 2008, в по крайней мере R2, здесь безопаснее, так как он говорит: «не могу сделать», а не просто сделать это).

Однако можно добавить оба столбца в одном выражении и уменьшить отток.

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