“De 20 horas para 20 segundos.”

Nem todo problema grande precisa de uma solução complexa. Às vezes, o tamanho do problema engana, e a gente sai procurando algo sofisticado quando a resposta cabe em poucas linhas.
Um ajuste na estratégia de atualização de colunas no SQL Server transformou um processo de horas em segundos.
Um cliente nos acionou porque estava travado nos testes de atualização do ERP: o processo inteiro estava levando cerca de 20 horas.
Esse cenário obrigaria manter a produção parada por todo esse tempo, o que estava tornando o procedimento extremamente custoso para uma empresa que opera 24×7.
Entramos em uma call, onde o cliente nos mostrou os logs da aplicação e o que estava sendo executado no banco.
O padrão logo ficou claro:
ALTER TABLE
Adicionar uma nova coluna à tabela.
UPDATE na tabela inteira
Preencher o valor padrão em cerca de 20 milhões de registros, levando aproximadamente uma hora por UPDATE.
A solução: deixar o SQL Server fazer o trabalho
Em vez de adicionar a coluna e executar um UPDATE para preencher todas as linhas, a solução foi usar o próprio ALTER TABLE com uma constraint DEFAULT:
Coluna NOT NULL
|
1 2 3 |
<span style="color: #000000;"><code style="font-family: Consolas, Monaco, monospace; font-size: 14px; line-height: 1.8;">ALTER TABLE dbo.Tabela ADD NovaColuna INT NOT NULL CONSTRAINT DF_Tabela_NovaColuna DEFAULT (0);</code></span> |
Se a coluna precisar aceitar valores NULL, existe uma alternativa:
Coluna NULL
|
1 2 3 |
<span style="color: #000000;"><code style="font-family: Consolas, Monaco, monospace; font-size: 14px; line-height: 1.8;">ALTER TABLE dbo.Tabela ADD NovaColuna INT NULL CONSTRAINT DF_Tabela_NovaColuna DEFAULT (0) WITH VALUES;</code></span> |
Por que fica instantâneo?
No SQL Server Enterprise, a partir da versão 2012, quando o valor padrão é uma constante e as condições para a operação de metadados são atendidas, o valor pode ser armazenado apenas nos metadados da tabela.
Nesse cenário, as linhas existentes não precisam ser reescritas fisicamente. O SQL Server retorna o valor padrão quando a linha é lida, sem precisar percorrer e atualizar os 20 milhões de registros.
O impacto na prática
Sem a atualização física de todas as linhas, é possível evitar uma longa operação de escrita, reduzir a geração de log e limitar o tempo de bloqueio associado à alteração.
Pontos de atenção
Essa técnica tem restrições importantes. Antes de aplicá-la, é necessário validar as características da coluna e do ambiente:
1. Edição do SQL Server
O comportamento descrito depende da edição e das condições da operação. Na Standard, a escrita física pode ser necessária, e o ganho tende a ser diferente.
2. Valor padrão constante
O DEFAULT precisa atender aos requisitos para a operação otimizada. Funções como NEWID() exigem valores distintos por linha e podem demandar a gravação física dos dados.
3. Tipos de dados
Tipos como varchar(max), nvarchar(max), varbinary(max), xml, text, image e geography estão entre as restrições a verificar na documentação.
4. Tamanho máximo da linha
A operação otimizada também tem restrições relacionadas ao tamanho máximo da linha, incluindo situações em que ele pode ultrapassar 8.060 bytes.
Consulte a documentação oficial da Microsoft para validar os requisitos aplicáveis à sua versão e edição do SQL Server.
Resultado alcançado
“De 20 horas para 20 segundos.”
Nas palavras do cliente, o processo que inviabilizava os testes de atualização passou a ser concluído em poucos segundos.
Dica extra: teste antes de ir para produção
O teste é o rei. Sempre execute a operação primeiro em um ambiente de homologação com configurações tão próximas da produção quanto possível.
Essa validação ajuda a identificar particularidades do ambiente, confirmar o comportamento esperado e garantir uma atualização mais segura e controlada.
Problema grande, solução simples, cliente satisfeito.
O desafio não foi escrever o código, foi enxergar onde estava o gargalo. Mais uma solução padrão #PowerTuning.





