Você roda uma query para buscar uma lista, depois percorre as linhas e dispara outra query por linha, então 200 posts viram 201 idas e voltas. Resolva carregando as linhas relacionadas em uma passada só: um join, uma query com IN indexada pelo id do pai, ou um loader de batch que junta os ids dentro de um tick da requisição. O sinal é a latência crescendo linearmente com a quantidade de resultados enquanto cada query individual parece rápida.
Por que os entrevistadores perguntam isso
Este é o bug de performance mais comum em aplicações com ORM, então o entrevistador está checando se você reconheceria isso na natureza em vez de só definir. Ele quer ouvir como você detectaria, porque as queries parecem saudáveis individualmente e só a contagem está errada. Mencionar as ferramentas que você usaria para achar isso separa quem já depurou de quem só leu a respeito.
Como estruturar sua resposta
- Defina o padrão com uma contagem concreta.
- Descreva como você detectaria isso em uma aplicação rodando.
- Dê pelo menos duas correções e quando cada uma se aplica.
- Observe o tradeoff de carregar tudo de forma antecipada.
Exemplo de resposta
Isso normalmente aparece no momento em que alguém renderiza uma lista. Você busca os pedidos, depois no template você toca em order.customer.name, e o ORM dispara em silêncio uma query por linha. Individualmente aquilo é meio milissegundo, então nada parece quebrado até a lista crescer e o endpoint levar quatro segundos. Eu detecto olhando a contagem de queries por requisição em vez da duração das queries; a maioria das ferramentas de APM mostra isso direto, e localmente eu ligo o log de queries e conto. A correção depende do formato. Para uma relação simples do tipo pertence a, um eager load ou um join resolve. Para um um para muitos em que o join multiplicaria linhas, eu prefiro uma segunda query com uma cláusula IN e costurar na memória. Em uma API GraphQL tem que ser um dataloader, porque os resolvers não fazem ideia de que estão sendo chamados em lote. O que eu evito é carregar tudo de forma antecipada por padrão, já que isso troca um problema por puxar meio banco para a memória.
Vai encarar essa entrevista em breve? O GhostPilot escuta a sua chamada ao vivo, identifica a pergunta no instante em que ela é feita e coloca uma resposta estruturada na sua tela em tempo real. Teste na sua próxima entrevista simulada ou pegue um Session Pass de $29, sem assinatura, para a hora da verdade.
Veja como funcionaPerguntas de acompanhamento que você pode esperar
- Como você pegaria isso no CI antes de ir para produção?
- Quando um join é pior que duas queries separadas?
- Como o batching funciona por uma árvore de resolvers do GraphQL?
Mais perguntas para Desenvolvedor Full Stack
Seu entrevistador vai fazer a própria versão desta. Cole a descrição real da vaga no Question Predictor gratuito e receba as 20 perguntas que essa vaga tem mais chance de fazer, com o que cada uma está de fato sondando.
Prever minhas perguntas