2026-10-29
Uma Consulta Mais Rápida Só Vale Se Der a Mesma Resposta
A listagem de ordens de um sistema de gestão que mantenho em produção chamava uma função Go por card para obter o total e o saldo. Um N+1 clássico: uma query para a lista e mais N para os cards.
A correção óbvia é uma única query com LEFT JOIN LATERAL que calcula os totais de todas as ordens de uma vez. O problema é que a regra de desconto já vivia em Go: percentual ou valor congelado, com ou sem insumos na base, arredondado em centavos. O SQL precisava copiar essa regra.
Duas cópias de uma regra divergem
Mantive a função Go como fonte única da verdade e escrevi um teste em volta dela. O teste cria ordens em 13 configurações (desconto percentual, valor fixo, origem NULL legada, com e sem insumos, pagamento parcial, dívida perdoada, um empate de meio centavo) e roda os dois caminhos. Total, saldo e "quitada" da query da lista precisam bater com a função Go dentro de uma fração de centavo.
Se divergir, o SQL está errado. Nunca o teste.
A primeira versão ainda tinha um buraco
Uma ordem sem nenhum serviço tem total 0 e saldo 0, então a lista a marcava como quitada. Zero menos zero é zero, mas nada tinha sido cobrado. Corrigi exigindo uma cobrança real antes de contar a ordem como quitada e incluí esse caso no mesmo teste.
Só achei porque olhei a lista depois da mudança, não porque os 13 casos pegaram. O teste cobre os casos em que você pensou.
"Mesma resposta" é uma afirmação separada
"Mais rápido" e "correto" são afirmações diferentes, e só uma delas aparece num profiler. Recentemente um mantenedor do benchmark ClickBench abriu um pull request para remover a entrada de um banco de dados, dizendo que os resultados vinham de código escrito para as 43 queries do benchmark e de respostas repetidas do cache (PR #2165, discussão no Hacker News). Não tenho como julgar esse caso. Mas a lição vale em escala pequena, numa tela de listagem: um ganho de velocidade que você não comparou com o caminho lento é um palpite.
Isso não é de graça. Uma regra duplicada em SQL tem custo de manutenção, e se ela muda com frequência eu moveria para um lugar só em vez de testar duas cópias. Para uma regra estável e ligada a dinheiro, o teste saiu mais barato.