Batch Job Lento para 5 Minutos

5 min de leitura

Consultoria de Performance — Batch job lento

Introdução

Em 2013, uma consultoria de performance foi contratada para resolver um problema crítico enfrentado por um cliente no setor de varejo de roupas. No final de cada mês, um processo em lote era executado por quatro horas, bloqueando completamente o acesso à aplicação de back-office para centenas de usuários. Essa situação gerava custos significativos e perturbava as operações.

O Briefing Inicial

Uma reunião foi convocada com os principais stakeholders: a equipe de consultoria, incluindo a liderança sênior, e mais de cinco representantes do cliente. Durante a reunião, o DBA do cliente apresentou dados do SQL Profiler, destacando as queries executadas durante o trabalho em lote.

O objetivo principal era eliminar o bloqueio para os usuários e melhorar a performance do processo em lote, que foi desenvolvido em Visual Fox Pro e interfaceava com um banco de dados SQL Server.

Análise de Performance

A análise dos dados do profiler revelou um padrão preocupante: de 20.000 queries executadas, aproximadamente 70–80% eram instruções SELECT idênticas. Cada uma dessas queries repetitivas consumia recursos significativos de CPU e tinha tempos de execução superiores a 100ms, indicando um grande gargalo de performance.

  • 20.000 queries totais executadas
  • 14.000 instruções SELECT idênticas (70-80%)
  • Tempo de execução superior a 100ms por query
  • Varredura completa de índice em vez de busca de índice

A raiz do problema estava no uso de uma função na cláusula WHERE da query. O SQL Server, que normalmente aproveita índices para recuperação rápida de dados, era forçado a realizar uma varredura completa de índice por causa dessa função.

Durante a consultoria, foi identificado que a aplicação aplicava uma função ISNULL a uma coluna que permitia valores nulos. A consultoria propôs uma solução simples, porém eficaz: remover a função ISNULL validando os dados na aplicação e atualizando quaisquer nulos existentes para zero no banco de dados.

A Primeira Correção

Ao remover a função ISNULL e implementar a validação na aplicação, a consultoria reduziu o tempo de execução do processo em lote de quatro horas para apenas 15 minutos. Essa melhoria drástica exemplificou o princípio comum de otimização de performance: resolver um único gargalo pode produzir resultados significativos.

Impacto na Performance:

De 4 horas para 15 minutos = redução de 93,75% no tempo de processamento

A equipe de consultoria abordou o desafio usando o princípio de Pareto: 20% do esforço produziu 80% dos resultados. Melhorias adicionais, embora possíveis, exigiriam esforços mais extensos para retornos decrescentes.

Otimização Adicional

Após a correção inicial, o cliente ficou satisfeito com o resultado, mas a consultoria identificou oportunidades adicionais de refinamento. Estas incluíam:

  • Limpeza das tabelas do banco de dados - Remoção de dados desnecessários
  • Modificação da aplicação para agrupar queries - Redução de viagens de ida e volta
  • Otimizações adicionais de queries - Ajuste fino dos gargalos restantes

A implementação dessas melhorias reduziu ainda mais o tempo de processamento em lote para apenas 5 minutos. Um relatório e uma apresentação abrangentes foram entregues ao vice-presidente do cliente, detalhando o processo de melhoria pragmática e a redução bem-sucedida do tempo de execução em lote de quatro horas para cinco minutos.

“Este projeto não apenas resolveu um problema crítico, mas também fomentou uma parceria de longo prazo entre a consultoria e o cliente.”

Recomendações Finais

A consultoria concluiu o engajamento enfatizando a importância de abordar problemas complexos de performance com uma perspectiva renovada. Fazer pausas, se afastar e retornar com uma mente clara muitas vezes pode revelar soluções simples para problemas aparentemente intratáveis.

Este projeto demonstrou que análise estruturada e esforço focado podem desbloquear ganhos significativos de performance, garantindo operações eficientes e ininterruptas para os sistemas críticos do cliente.

Principais Aprendizados:

  • Soluções simples frequentemente têm o maior impacto - remover uma função resolveu 93% do problema
  • O SQL Profiler é crucial para identificar padrões de queries repetitivas
  • Funções em cláusulas WHERE podem impedir o uso de índices e causar varreduras completas
  • Validação no nível da aplicação pode substituir funções de banco de dados para melhor performance
  • O Princípio de Pareto se aplica - 20% de esforço produzindo 80% dos resultados
  • Perspectiva renovada importa - dar um passo atrás pode revelar soluções óbvias

Resultados Finais:

Tempo de processamento em lote: 4 horas → 5 minutos (melhoria de 98,96%)

Impacto para o usuário: Eliminação do bloqueio de 4 horas para centenas de usuários