Sobre o projeto
Sistema de automação industrial desenvolvido em Delphi 7, operando 24 horas por dia, 7 dias por semana no chão de fábrica do setor automotivo. Quando o projeto chegou, o sistema apresentava lentidão severa em diversas operações básicas. A causa raiz era um padrão arquitetural problemático consolidado ao longo dos anos.
O sistema realizava buscas repetidas ao banco de dados para recuperar a mesma informação toda vez que precisava,
em vez de armazená-la em objetos ou variáveis durante o ciclo de execução. Somado a isso,
as consultas eram feitas com SELECT * sem índices nas tabelas, sem WITH(NOLOCK)
e com múltiplos subselects aninhados, combinação que tornava operações simples
extraordinariamente lentas em ambiente de alta concorrência.
Além da lentidão, frequentes Access Violations e travamentos exigiam intervenções de emergência em fins de semana e madrugadas para manter a produção funcionando. Hoje, após as otimizações, o sistema roda semanas ou meses sem nenhuma intervenção humana. Quando há intervenção, é para entregar melhorias, não para apagar incêndio.
O que foi feito
- Eliminação de buscas repetidas ao banco: dados passaram a ser carregados uma vez e armazenados em objetos/variáveis durante o ciclo de execução, reduzindo drasticamente o volume de I/O
- Criação de índices nas tabelas que operavam sem eles, impactando diretamente as queries mais executadas do sistema
- Adição de
WITH(NOLOCK)em consultas de leitura, eliminando contenção de locks em ambiente com múltiplos usuários simultâneos - Substituição de
SELECT *por campos específicos, reduzindo transferência de dados desnecessária e aliviando a rede e o buffer do banco - Refatoração de subselects aninhados por JOINs otimizados, tornando o plano de execução previsível e eficiente
- Correção de Access Violations e travamentos que forçavam reinicializações manuais em ambiente sem janela de manutenção
- Ciclo de embalagem com ganho de 85% de eficiência após otimizações nas rotinas mais críticas
- Processo de RGI reduzido para 10% do tempo original: o que levava ~8 minutos passou a ser concluído em menos de 2 segundos (0,8s a 1,2s)