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.