“De 20 horas para 20 segundos.”

“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:

1

ALTER TABLE

Adicionar uma nova coluna à tabela.

2

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

Se a coluna precisar aceitar valores NULL, existe uma alternativa:

Coluna NULL

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.

Tags: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,

Power Tuning
Visão geral da privacidade

Este site utiliza cookies para que possamos lhe proporcionar a melhor experiência de usuário possível. As informações dos cookies são armazenadas em seu navegador e executam funções como reconhecê-lo quando você retorna ao nosso site e ajudar nossa equipe a entender quais seções do site você considera mais interessantes e úteis.