Por que adicionar instantaneamente uma coluna NOT NULL com uma restrição padrão?

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 executo esse script de teste, o ALTERcomando UPDATEleva 6 segundos, o que é compreensível.

No entanto, o ALTERcom o DEFAULT NOT NULLexecuta instantaneamente, mesmo em uma tabela muito maior. Existe alguma explicação sobre por que isso é instantâneo? No disco físico, os dados ainda precisam ser gravados em todas as linhas, certo?

Tentei examinar SET STATISTICS IO ONe o plano de consulta, no entanto, esses não parecem estar disponíveis para operações DDL.

Akash
fonte

Respostas:

23

Sim, adicionar uma coluna com NOT NULL e um padrão na verdade não grava os valores em todas as linhas no momento da alteração, portanto, não é mais uma operação de tamanho de dados. Quando você seleciona na tabela, as colunas são realmente materializadas em sys.system_internals_partition_columns , o que impede que todos os valores precisem ser gravados (até que sejam alterados). Observe que isso não funciona para todos os tipos de dados e requer o Enterprise Edition.

Remus Rusanu explica isso com mais detalhes aqui:

Além disso, ALTERpelo menos ainda não podemos mostrar um plano, porque o SQL Server não produz um, mas para ver E / S, você pode usar o SQL Sentry Plan Explorer . * Esta captura de tela mostra a adição de uma coluna, c5 , "online" como descrito acima e, em seguida, outra coluna, c6, "offline" porque os tipos de LOB não são suportados. Você pode ver que a E / S é expressa principalmente como leituras, em vez de gravações, mas o mais significativo é o (inválido!) UPDATEAssociado à alteração offline.

E / S para alteração online vs. offline

Se você não possui o Enterprise Edition, as duas instruções terão o secundário UPDATEanexado (e as leituras associadas). (E se você usar a versão gratuita do Plan Explorer, que não recebe a pilha de chamadas de consulta completa, não verá o acima - verá apenas uma árvore de instruções vazia. É necessária uma versão paga para ver a consulta completa pilha de chamadas.)

Observe que o SQL Server produzirá um plano estimado , mas não é muito útil. Em absoluto. E o plano estimado para uma alteração online é idêntico ao plano estimado para uma alteração offline.

Diagrama do plano para alteração on-line

* Isenção de responsabilidade: trabalho para o SQL Sentry.

Aaron Bertrand
fonte
4
+1: esp. para "Enterprise Edition". Eu sempre me perguntei por que ele não funciona em alguns dos meus sites de clientes ...
RBarryYoung