Чому додається стовпець 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

Коли я виконую цей тестовий сценарій, то ALTERз UPDATEзаймає 6 секунд , що цілком зрозуміло.

Однак ALTERвиконавці DEFAULT NOT NULLвиконують миттєво навіть на значно більшому столі. Чи є якесь пояснення, чому це моментально? На фізичному диску дані все-таки потрібно записати у всі рядки?

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

Відповіді:


23

Так, додавання стовпця "NOT NULL" та за замовчуванням насправді не записує значення у всі рядки під час зміни, тому це більше не є операцією з розміром даних. Коли ви вибираєте з таблиці, стовпці фактично матеріалізуються з sys.system_internals_partition_column , що запобігає запису всіх значень (поки вони не будуть змінені). Зауважте, що це працює не для всіх типів даних і вимагає Enterprise Edition.

Ремус Русану пояснює це детальніше тут:

Також, ALTERпринаймні, ми все ще не можемо показати вам план, оскільки SQL Server не виробляє його, але щоб побачити введення / виведення, ви можете використовувати SQL Sentry Plan Explorer . * На цьому екрані показано додавання стовпця, c5 , "онлайн", як описано вище, а потім інший стовпець, c6, "офлайн", оскільки типи LOB не підтримуються. Ви можете бачити, що введення / виведення здебільшого виражається як читання, а не записування, але більш важливим є (недійсний!), UPDATEПов’язаний із зміною офлайн.

Введення / виведення для Інтернету проти офлайн зміни

Якщо у вас немає Enterprise Edition, обидва твердження будуть UPDATEдодані вторинними (і пов'язаними з ними прочитаними). (І якщо ви використовуєте безкоштовну версію Plan Explorer, яка не отримує повний стек викликів запитів, ви не побачите вищезгаданого - ви просто побачите порожнє дерево висловлювань. Для отримання повного запиту потрібна платна версія. стек викликів.)

Зауважте, що SQL Server створить орієнтовний план, але це не дуже корисно. Зовсім. І орієнтовний план для зміни в Інтернеті є ідентичним прогнозованому плану для офлайн-змін.

План-схема для зміни в Інтернеті

* Відмова: Я працюю в SQL Sentry.


4
+1: esp. для "Enterprise Edition". Я завжди цікавився, чому це не працює на деяких моїх сайтах клієнтів ...
RBarryYoung
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.