Warum wird eine NOT NULL-Spalte mit einer Standardeinschränkung sofort hinzugefügt?

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

Wenn ich dieses Testskript ausführe, dauert das ALTERmit UPDATE6 Sekunden, was verständlich ist.

Allerdings wird das ALTERmit dem DEFAULT NOT NULLsofort auch auf einem viel größeren Tisch ausgeführt. Gibt es eine Erklärung dafür, warum dies augenblicklich geschieht? Auf der physischen Festplatte müssen noch Daten in alle Zeilen geschrieben werden, oder?

Ich habe versucht, SET STATISTICS IO ONden Abfrageplan zu betrachten, aber diese scheinen für DDL-Operationen nicht verfügbar zu sein.

Akash
quelle

Antworten:

23

Ja. Wenn Sie eine Spalte mit NOT NULL und einem Standardwert hinzufügen, werden die Werte zum Zeitpunkt der Änderung nicht in alle Zeilen geschrieben, sodass es sich nicht mehr um eine Datengrößenoperation handelt. Wenn Sie aus der Tabelle auswählen, werden die Spalten tatsächlich aus sys.system_internals_partition_columns materialisiert , wodurch verhindert wird, dass alle Werte geschrieben werden müssen (bis sie geändert werden). Beachten Sie, dass dies nicht für alle Datentypen funktioniert und Enterprise Edition erfordert.

Remus Rusanu erklärt dies hier ausführlicher:

Auch für eine ALTERzumindest, wir können immer noch nicht zeigen Sie einen Plan , da SQL Server nicht ein produzieren, aber zu sehen , I / O, können Sie SQL Sentry - Plan Explorer . * Dieser Screenshot zeigt das Hinzufügen einer Spalte, c5 , "online" wie oben beschrieben, und dann eine andere Spalte, c6, "offline", da LOB-Typen nicht unterstützt werden. Sie können sehen, dass die E / A meistens eher als Lese- als als als Schreibzugriff ausgedrückt wird. Was jedoch aussagekräftiger ist, ist die (ungültige!) UPDATEVerknüpfung mit der Offline-Änderung.

I / O für Online vs. Offline ändern

Wenn Sie nicht über Enterprise Edition verfügen, wird an beide Anweisungen die sekundäre UPDATEangefügt (und die zugehörigen Lesevorgänge). (Wenn Sie die kostenlose Version von Plan Explorer verwenden, die nicht den vollständigen Abfrageaufrufstapel erhält, wird das Obige nicht angezeigt. Sie sehen lediglich einen leeren Anweisungsbaum. Zum Anzeigen der vollständigen Abfrage ist eine kostenpflichtige Version erforderlich Aufrufstapel.)

Beachten Sie, dass SQL Server einen geschätzten Plan erstellt, der jedoch nicht sehr nützlich ist. Überhaupt. Der geschätzte Plan für eine Online-Änderung ist identisch mit dem geschätzten Plan für eine Offline-Änderung.

Plandiagramm für online ändern

* Haftungsausschluss: Ich arbeite für SQL Sentry.

Aaron Bertrand
quelle
4
+1: esp. für "Enterprise Edition". Ich habe mich immer gefragt, warum es bei einigen meiner Kunden nicht funktioniert hat ...
RBarryYoung