Почему добавляется столбец NOT NULL с ограничением по умолчанию?

16
CREATE TABLE TestTab (ID INT IDENTITY(1,1), st nvarchar(100))

INSERT INTO TestTab (st) values ('a')
INSERT INTO TestTab (st) values ('b')
INSERT INTO TestTab (st) values ('c')
INSERT INTO TestTab (st) values ('d')
INSERT INTO TestTab (st) values ('e')

INSERT INTO TestTab (st) SELECT TOP 10000 st from testtab
GO 30

ALTER TABLE TestTab ADD newcol nvarchar(10) DEFAULT 'newcol'
UPDATE TestTab SET newcol = 'newcol'  --6 sec
ALTER TABLE TestTab ADD newcol1 nvarchar(10) DEFAULT 'newcol1' NOT NULL

DROP TABLE TestTab

Когда я выполняю этот тестовый сценарий, команда ALTERwith UPDATEзанимает 6 секунд, что понятно.

Тем не менее, ALTERс DEFAULT NOT NULLИсполняет мгновенно даже на гораздо большем столе. Есть ли объяснение, почему это происходит мгновенно? На физическом диске данные все еще должны быть записаны во все строки, верно?

Я попытался взглянуть на SET STATISTICS IO ONплан запроса, но, похоже, он недоступен для операций DDL.

Акаша
источник

Ответы:

23

Да, добавление столбца с NOT NULL и значением по умолчанию фактически не записывает значения во все строки во время изменения, так что это больше не операция с размером данных. Когда вы выбираете из таблицы, столбцы фактически материализуются из sys.system_internals_partition_columns , что предотвращает необходимость записи всех значений (до тех пор, пока они не будут изменены). Обратите внимание, что это не работает для всех типов данных и требует Enterprise Edition.

Ремус Русану объясняет это более подробно здесь:

Кроме того, по ALTERкрайней мере, мы все еще не можем показать вам план, потому что SQL Server его не создает, но для просмотра операций ввода-вывода вы можете использовать SQL Sentry Plan Explorer . * На этом снимке экрана показано добавление столбца, c5 «онлайн», как описано выше, а затем другой столбец, с6, «автономно», поскольку типы больших объектов не поддерживаются. Вы можете видеть, что ввод / вывод в основном выражается как чтение, а не запись, но более показательным является (недействительный!), UPDATEСвязанный с автономным изменением.

Ввод / вывод для онлайн против автономного режима

Если у вас нет Enterprise Edition, к обоим операторам будет UPDATEприсоединен вторичный (и связанные чтения). (И если вы используете бесплатную версию Plan Explorer, которая не получает полный стек вызовов запросов, вы не увидите вышеизложенное - вы просто увидите пустое дерево операторов. Платная версия необходима для просмотра полного запроса стек вызовов.)

Обратите внимание, что SQL Server создаст примерный план, но он не очень полезен. Совсем. И предполагаемый план для онлайн-изменения аналогичен предполагаемому плану для автономного изменения.

План-схема для онлайн-изменения

* Отказ от ответственности: я работаю на SQL Sentry.

Аарон Бертран
источник
4
+1: особенно для "Enterprise Edition". Я всегда задавался вопросом, почему это не работает на некоторых из моих сайтов клиентов ...
RBarryYoung