SITUAÇÃO (ANTES DA NOSSA ATUAÇÃO)
A Icatu Seguros tinha uma rotina de processamento no banco de dados SQL que diariamente era executada. Essa rotina efetuava uma série de cálculos para o faturamento, e eventualmente levava algumas horas para processar, causando indisponibilidade no banco de dados deles, devido a quantidade de bloqueios durante seu processo. Quando a execução era muito demorada, acabava inviabilizando o uso da aplicação, tendo que em diversos casos, abortar o processamento. A ausência de índices assertivos para determinadas consultas, bem como alguns padrões de escrita de código, utilização de cursores e processamento linha a linha de cada movimento, e uso indiscriminado de tabelas temporárias, tornava o processo muito lento e oneroso para o banco de dados.
IMPLICAÇÕES
A escrita do código para bancos de dados relacionais, utilizando essa abordagem row-by-row, gera um impacto muito negativo no ambiente como um todo. Apesar do baixo processamento, a execução do código tende a ser morosa, levando muito mais tempo do que realmente se faz necessário para recuperar e processar os resultados das consultas. Ainda a ausências de índices assertivos para as consultas em questões, fazia com que uma grande massa de dados fosse lida para processar poucas linhas, gerando bloqueios desnecessários de registros no banco de dados, e em alguns casos, tabelas inteiras. Fora isso o uso continuo de tabelas temporárias poder ser um ponto de gargalo em algumas situações, se não forem devidamente indexadas. A ausência de índices e estatísticas faz com que o banco de dados possa vir a tomar decisões ruins ao montar os planos de execução, levando um processo demorar horas.
O QUE FIZEMOS
Diferentemente do case anterior, em que foi possível refatorar todas as procedures envolvidas no processo, devido ao volume de código envolvido em uma execução (mais de 100 procedures com milhares de linhas), para ser possível efetuar entregas incrementais, optamos por focar nos gargalos de cada execução. Para isso é gerado um log detalhado com o tempo de cada etapa da execução. Uma fez refatorado o código é feito o “merge” apenas do trecho ajustado e o mesmo é submetido para testes e validações.
ENTREGÁVEIS
O trabalho ainda está em fase de desenvolvimento, apesar dos ganhos já se mostrarem muito interessantes:
Entregas Incrementais: Devido a complexidade do código (milhares de linhas), as entregas estão sendo incrementais, sendo feito diversos testes a cada procedure alterada.
Confiabilidade: Todo código que foi refatorado é submetido a testes rigorosos não apenas de performance, mas também garantido a confiança em relação ao código anterior.
Sustentabilidade: A criação de índices assertivos, se torna primordial para garantir a sustentabilidade do sistema, mesmo com o constante crescimento do volume de dados no banco de dados. Isso dá mais segurança que para cada processamento de lote, a duração total do processamento não aumente com o passar do tempo.
Disseminação do Conhecimento: Todo código alterado é discutido com a equipe de desenvolvimento, mostrando os benefícios alcançados. Essa constante discussão aumenta o conhecimento da equipe no desenvolvimento diário das suas tarefas, visando entregas com mais qualidade e performance, minimizando os problemas no ambiente do banco de dados.