Eu tenho uma tabela com 45 milhões de linhas (45 GB de espaço de dados e 2 GB de espaço de índice). Eu adicionei uma nova coluna e terminou instantaneamente.
alter table T add C char(25)
Então descobri que o tamanho é muito pequeno, então executei a seguinte consulta.
alter table T alter column C varchar(2500)
E funciona uma hora e ainda está funcionando. sp_whoisactive mostra (no momento, ainda em execução)
reads: 48,000,000
writes: 5,000,000
physical reads: 3,900,000
Não deveria ser muito rápido?
Supondo que todas as colunas criadas anteriormente tenham largura fixa como
char
edatetime
, adicionar a colunaC
acima apenas a adicionou ao final da seção de largura fixa do registro (efetivamente uma alteração somente meta). No entanto, reformulá-lo como umvarchar
exigia que fosse movido para a seção de largura variável do registro, forçando uma reconstrução implícita da tabela. Paul Randal explica os detalhes internos dos registros em Inside the Storage Engine: Anatomy of a Data Record .Eu testei o caso. Você pode fazer isso mais rápido usando as etapas abaixo:
Isso lhe dará um desempenho muito melhor.
O motivo é que alterar a coluna na tabela que contém dados exigirá muita transferência de dados e alinhamento da página de dados. Usando minha solução, você apenas insere dados sem qualquer reorganização de página.
Editar:
no meu teste, usei uma tabela com cerca de 40 M de linhas, tamanho da tabela de 7 GB e tamanho do índice de 2,5 GB. O método sugerido foi de 1 minuto VS 4 minutos quando usei renomear o campo na tabela original