Perché l'aggiunta di una colonna NOT NULL con un vincolo predefinito è istantanea?


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

Quando eseguo questo script di test, il ALTERcon UPDATErichiede 6 secondi, il che è comprensibile.

Tuttavia, ALTERwith with DEFAULT NOT NULLviene eseguito istantaneamente anche su una tabella molto più grande. C'è qualche spiegazione sul perché questo è istantaneo? Sul disco fisico, i dati devono ancora essere scritti su tutte le righe, giusto?

Ho provato a guardare SET STATISTICS IO ONe il piano di query, tuttavia quelli non sembrano essere disponibili per le operazioni DDL.

Risposte:


23

Sì, l'aggiunta di una colonna con NOT NULL e un valore predefinito in realtà non scrive i valori su tutte le righe al momento della modifica, quindi non è più un'operazione di dimensione dei dati. Quando si seleziona dalla tabella, le colonne vengono effettivamente materializzate da sys.system_internals_partition_columns , il che impedisce la scrittura di tutti i valori (fino alla loro modifica). Si noti che questo non funziona per tutti i tipi di dati e richiede Enterprise Edition.

Remus Rusanu lo spiega in modo più dettagliato qui:

Inoltre, per lo ALTERmeno, non possiamo ancora mostrarti un piano perché SQL Server non ne produce uno, ma per vedere l'I / O, puoi usare SQL Sentry Plan Explorer . * Questa schermata mostra l'aggiunta di una colonna, c5 , "online" come descritto sopra, quindi un'altra colonna, c6, "offline" perché i tipi di LOB non sono supportati. Puoi vedere che l'I / O è espresso principalmente in lettura anziché in scrittura, ma ciò che più dice è il (non valido!) UPDATEAssociato alla modifica offline.

I / O per alterazioni online e offline

Se non si dispone di Enterprise Edition, entrambe le istruzioni avranno il secondario UPDATEallegato (e le letture associate). (E se usi la versione gratuita di Plan Explorer, che non ottiene lo stack di chiamate dell'intera query, non vedrai quanto sopra: vedrai solo un albero di istruzioni vuoto. Per vedere la query completa è necessaria una versione a pagamento call stack.)

Si noti che SQL Server produrrà un piano stimato , ma non è molto utile. Affatto. E il piano stimato per un alter online è identico al piano stimato per un alter offline.

Diagramma del piano per alter. Online

* Disclaimer: lavoro per SQL Sentry.


4
+1: esp. per "Enterprise Edition". Mi sono sempre chiesto perché non funzionasse in alcuni dei siti dei miei clienti ...
RBarryYoung
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.